c++ 结构体字节对齐

转载 2012年03月21日 17:57:36
结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体.
struct
{
char a;
short b;
char c;
}S1;
struct
{
char a;
char b;
short c;
}S2;
分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4
可见,虽然两个结构体所含的元素相同,但因为其中存放的元素类型顺序不一样,所占字节也出现差异。这就是字节对齐原因。通过字节对齐,有助于加快计算机的取数速度,否则就得多花指令周期。
字节对齐原则
结构体默认的字节对齐一般满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
通过这三个原则,就不难理解上面两个struct的差异了.
对于struct S1, 为了使short变量满足字节对其准则(2), 即其存储位置相对于结构体首地址的offset是自身大小(short占2个字节)的整数倍,必须在字节a后面填充一个字节以对齐;再由准则(3),为了 满足结构体总大小为short大小的整数倍,必须再在c后面填充一个字节。

对于struct S2, 却不必如上所述的填充字节,因为其直接顺序存储已经满足了对齐准则。
如果将上面两个结构体中的short都改为int(占4个字节), 那么会怎么样呢? 程序得出sizeof(S1)=12, sizeof(S2)=8
利用上面的准则,也不难计算得出这样的结果。S1中在a后面填充3个字节、在c后面填充3个字节,这样一共12个字节;S2中在a、b顺序存储之后填充两个字节用以对其,这样一共就8个字节。
当然,在某些时候也可以设置字节对齐方式。这就需要使用 #pragma pack 。
#pragma pack(push) //压栈保存
#pragma pack(1)// 设置1字节对齐
struct
{
char a;
short b;
char c;
}S1;
#pragma pack(pop) // 恢复先前设置
如上所示,将对其方式设为1字节对齐,那么S1就不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

相关文章推荐

C/C++ 结构体字节对齐详解

一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,...

关于C++ 字节对齐 (结构体)

struct的sizeof问题  struct s1 {  char a;  double b;  int c;  char d; }; struct s2 {  char a;  cha...
  • AndGod
  • AndGod
  • 2011年08月30日 23:44
  • 328

C++ 结构体字节对齐

1.字节对齐的作用 加快CPU访问内存速度,平台移植 2.如何计算字节对齐后的结构体大小 输入下面代码: #include struct stTest { int a; char b; ...

C++之字节对齐与结构体大小(转)

转载自:http://blog.sina.com.cn/s/blog_725dd1010100tmp6.html 说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到...

C/C++ 结构体 字节对齐原则详细举例解释 及sizeof的基本用法

VC字节对齐全攻略 VC中下面几个结构体大小分别是多少呢 struct MyStruct {     double m4;     char m1;     int  m3; };  ...
  • stormwy
  • stormwy
  • 2012年10月17日 10:10
  • 857

[C++]字节对齐与结构体大小

说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对size...

C/C++结构体字节对齐详解

结构体的sizeof 先看一个结构体: struct S1 {     char c;     int i; };  sizeof(s1)在VC6中按默认设置得到的结果为8。 我们...

C++ 字节对齐与结构体/共用体的大小

 转载自 http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 一、解释 现代计算机中内存空间都是按照byte划分...

C/C++结构体字节对齐详解

注意:成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所...

[C++]字节对齐与结构体大小

转自http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 说明: 结构体的sizeof值,并不是简单的将其中各元素所占...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ 结构体字节对齐
举报原因:
原因补充:

(最多只允许输入30个字)