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)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

我眼中的架构师:一个优秀的架构师应该具备什么?

时光退回到七八年以前,那个时候“架构师“还是一个很“高大上“的title。可是在今天的互联网圈,随便一个工作了三、五年的开发人员,都可以称之为架构师。随便多翻几个招聘网站,你可以看到:前端架构师、后端...
  • chunlongyu
  • chunlongyu
  • 2016年12月04日 20:11
  • 2987

一张图告诉你什么是系统架构师

这张图从架构师的综合能力、岗位认识、岗位职责等方面,清楚的画出了作为一个架构的基本准则。人人都想成为架构师,可作为架构你达到了上面的要求了吗? 系统架构师是个神奇的岗位。为什么这么说,在一个人数不多...
  • youanyyou
  • youanyyou
  • 2018年01月09日 10:11
  • 312

c++ 结构体字节对齐

结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体. struct { char a; short b;...
  • lingchen214
  • lingchen214
  • 2012年03月21日 17:57
  • 395

C++字节对齐与结构体大小计算

转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果。...
  • loveRooney
  • loveRooney
  • 2014年07月29日 11:24
  • 1816

C++中结构体的字节对齐问题

  前不久,在C++程序中碰到一个有关结构体字节对齐的问题。一。问题描述在程序中,定义了一个结构体,如下:typedef struct{   char name[33];   int ID;   in...
  • roger_77
  • roger_77
  • 2006年04月02日 00:18
  • 3031

中间件小结

最近学习关于Java中间件的开发,里面存在了许多专业的名词,所以在此总结一下,可以在未来复习,复习。 1.中间件的定义,中间件是出于操作系统与用户应用软件的之上的一个层级。 2.中间件的分类,中间...
  • Androidlushangderen
  • Androidlushangderen
  • 2014年09月29日 16:02
  • 1644

漫画:什么是架构师?

点击上方“程序员小灰”,选择“置顶公众号”有趣有内涵的文章第一时间送达!于是,小灰去向大黄请教这是有关未来的故事:从前,有一个赶路的人路过一片工地,看到三个年轻人在工地上搬砖。于是,他问其中一个人:于...
  • bjweimengshu
  • bjweimengshu
  • 2017年12月25日 00:00
  • 1010

C++ 结构体字节对齐问题

结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任...
  • songchao_2011
  • songchao_2011
  • 2014年06月02日 12:14
  • 1020

结构体字节对齐,pragma pack,__attribute__(packed)

程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏   蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。 例如我们设置结构体的对齐方式: stru...
  • zhangxiong2532
  • zhangxiong2532
  • 2016年03月08日 14:46
  • 2198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ 结构体字节对齐
举报原因:
原因补充:

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