总结面试时没有回答上的设置内存对齐方式问题
来源:互联网 发布:php.ini-production 编辑:程序博客网 时间:2024/05/09 11:18
前两天面试某公司时,没有回答上的一个问题,总结如下,以供参考。
问:下面这个结构类型的实例变量占用多少内存:
struct struct1
{
int i;
short j;
char c;
};
我反问:是啥语言啥机器啥编译环境?
他回答说:VC6.0下。
我:内存对齐后占8byte。
他又继续问:如何让它只占7byte?
我的第一反应是使用位段,正准备回答,又感觉不对,位段不能让它不对齐啊。又想了几秒钟,还是不会,只好回他说没玩过……
今天下午去图书馆翻了下《代码优化:有效使用内存》,发现里面提到了两种方法:
法1:
#pragma pack(push)
#pragma pack(1)
struct struct1
{
int i;
short j;
char c;
};
#pragma pack(pop)
法2:
修改编译指令的参数,来禁止内存对齐:
VC++ :/Zn1(VS2005下,右击项目-属性-配置属性-C/C++-代码生成-结构成员对齐-选“1字节(/Zn1):”(即禁止内存对齐),默认是使用默认值,即按照结构中占用空间最大的成员进行对齐。的size进行对齐。
Borland C++ : /-a1
法2是对整个项目禁用内存对齐,而法1可以针对特定的结构禁用内存对齐,其提供了更大的灵活性.
另外,该书中还提到:
char不对齐;
short沿偶地址对齐;
int/float沿取值为4的倍数的地址对齐。
double沿取值为8的倍数的地址对齐。
VS2005下,默认是使用默认值,即按照结构中占用空间最大的成员进行对齐,我们可以测试下面这个结构:
struct struct2
{
char i;
short d;
double c;
short j;
};
//保持为默认值或修改编译参数/Zn?,猜下sizeof结果为多少?:)
printf("struct2:%d/n",sizeof(struct2));
struct2 st;
printf("%p/n",&st.i);
printf("%p/n",&st.d);
printf("%p/n",&st.c);
printf("%p/n",&st.j);
补充:数据的手工对齐:
char *p;
int temp = align_power-1;
p=(char*)malloc(need_size + temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以释放p前记得要归位
注:align_power是所需要的对齐幂,char*(也可以为int*)是指针类型。另外,释放p之前记得让其指向所申请的内存的首地址上。
- 总结面试时没有回答上的设置内存对齐方式问题
- 12-13号(针对没有回答清楚的)面试总结
- 设置UIButton上字体的对齐方式
- 设置UIButton上字体的对齐方式
- 面试常见问题的回答方式
- 面试中经常遇到的问题,及建议回答方式
- 如何回答十个最棘手的面试问题(上)
- 面试中最难回答的问题
- 面试官问题的回答
- 我面试时没有答上的MYSQL问题
- c++对齐方式总结(上)
- 程序员经典面试回答,怎样回答面试官的问题
- [iphone]设置UIButton上字体的对齐方式
- [iphone]设置UIButton上字体的对齐方式
- [iOS]设置UIButton上字体的对齐方式
- 面试时对于一些问题的回答注意事项
- 面试时遇到不会回答的问题怎么办??
- 内存对齐的问题
- >>>print "hello csdn"
- SQL SERVER 2005 CLR 部署UDT,Triggers,Functions,Procedure,Aggregates
- 网络在线游戏开发心得(服务器端、Java)
- 流氓软件,你流氓,我也流氓
- 【转载】SharpReader阅读器使用手冊(博客)
- 总结面试时没有回答上的设置内存对齐方式问题
- 博客开张!好好学习
- 小试cglib
- [MYSQL]函數應用11/9
- 农历中天干地支的计算【C代码】
- 五﹑博客周刊•推荐Blog圈子
- 【转载】RSS 学习心得 、基础
- .net传值 问题
- 用HttpWebRequest代替WebClient解决POST超时问题