(C)字节对齐#pragma pack()
2015-07-22 12:48
239 查看
1. 为什么要进行对齐
对于结构体,编译器会自动进行成员变量对齐处理,是为了提高运算效率。缺省情况下是自然对齐方式。
2. 自然对齐
即默认对齐,按照结构体的成员中size最大的成员进行对齐。例:
struct naturalalign { char a; short b int c; };
上述结构体,成员size最大的是c,sizeof(c)为4,因此,结构体中的成员都以4为单位进行对齐,sizeof(naturalalign)为12.
3. 指定对齐
即按照指定的字节大小进行对齐。使用伪指令:
#pragma pack(N); //按照N个字节进行对齐
#pragma pack();//取消指定对齐
注:
如果N大于结构体中最大成员的size,则不起作用。仍然以默认方式对齐。
例:
#pragma pack(N) struct natural { char a; int b; char c; }; #pragma pack();
当N分别为4,8,16时,其对齐方式是一样的。sizeof(natural)都为12;
当N为2时,sizeof(natural)为6.
4. Intel1.微软面试题
#pragma pack(8) struct example1 { short a; long b; }; struct example2 { char c; example1 struct1; short e; }; #pragma pack(); int main(int argc,char*argv[]) { example2 struct2; cout<<sizeof(example1)<<endl; cout<<sizeof(example2)<<endl; cout<<(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)<<endl; return 0; }
问:程序输出结果?
分析:
struct example1中成员最大size为4,故指定对齐8不起作用。
sizeof(example1) = 4*2 = 8;
struct example2中包含struct example1,其本身成员最大size为2,而example1中的成员最大size为4,指定对齐8也不起作用。,
sizeof ( example2 ) = 4*4 = 16;
由于struct example2中成员以4为单位对界,因此,char变量c后应该补充3个bit,后面才是struct1的地址,故最后输出结果为4.
相关文章推荐
- centos下-bash: pecl: command not found的解决方法
- 把全世界的人们都联系在一起,提升人们的社交参与度
- iOS开发之沙盒机制(SandBox)
- Search in Rotated Sorted Array II
- HDU - 1312 - Red and Black
- eclipse 自动包含头文件
- 极客学院java 线程代码笔记1
- WebKit的一些笔记3(基础篇)
- NOJ 1064 快速排序
- shell几种字符串加密解密的方法
- 跨工厂物料状态/特定工厂的物料状态
- BZOJ 1037 [ZJOI2008]生日聚会Party
- android dialog 有关token的问题
- 整套spark视频教程免费下载,还有Hadoop
- mybatis的mapper.xml 小结
- Github上的几个C++开源项目
- ROS images和OpenCV images之间的转化
- Linux的top命令详细解析
- JavaScript检测上传文件大小的方法
- windows在ISR中不能睡眠的原因