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.

(C)字节对齐#pragma pack()的更多相关文章

  1. 字节对齐#pragma pack

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  2. pragma pack,字节对齐

    关于字节对齐 pragma pack 一. 测试代码: // packTest.cpp : Defines the entry point for the console application. / ...

  3. #pragma pack(n)对齐格式

    #pragma pack(n)对齐格式 #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐.当元素字节小于n时,要扩展到n:若元素字节大于n则占用其实际大小. struct ...

  4. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  5. (转载)关于#pragma pack(push,1)和#pragma pack(1)

    转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...

  6. #pragma pack(push,1)与#pragma pack(pop)

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  7. c编译器字节对齐指令

    #pragma pack (n)             作用:C编译器将按照n个字节对齐.#pragma pack ()               作用:取消自定义字节对齐方式. #pragma ...

  8. C++字节对齐与位域

    环境: win7_x64旗舰版.VS2015企业版 一.字节对齐: 说明:为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐. 1. 指定对齐参数值: ...

  9. 【转】#pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

随机推荐

  1. bzoj2748 [HAOI2012]音量调节 背包

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  2. poj 3608 凸包间的最小距离

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7632   Accepted:  ...

  3. msp430项目编程45

    msp430综合项目---蓝牙控制系统45 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  4. Python入门--8--字符串

    一.创建.修改字符串 str1='呆呆 槑槑 木木 林林' str1[1] #输出呆 str1[2] #输出' ',也就是空值 str1=str[:5]+'插入乖呆 '+str1[5:] #修改字符串 ...

  5. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  6. rsync故障排查整理

    1.客户端的错误现象:No route to host rsync服务端开启了iptables防火墙 rsync -avz /etc/hosts rsync_backup@172.16.1.41::b ...

  7. Spring基于Setter函数的依赖注入(DI)

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection/spring-setter-based-dependenc ...

  8. CentOS 5.4 final下Systemtap的安装

    CentOS 5.4 final下Systemtap的安装  时间:2015-02-11来源:linux网站 作者:zklth  一.Systemtap运行环境需求   (1)linux kernel ...

  9. J粒子发现40周年-丁肇中中科院讲座笔记

    J粒子发现40周年-丁肇中中科院讲座笔记 华清远见2014-10-18   北京海淀区  张俊浩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVuZm ...

  10. 【数据库摘要】6_Sql_Inner_Join

    INNER JOIN 操作符 INNER JOIN keyword在表中存在至少一个匹配时返回行. SQL INNER JOIN 语法 SELECT column_name(s) FROM table ...