C/C++结构体字节对齐详解
作者:网络转载 发布时间:[ 2014/5/22 11:28:20 ] 推荐标签:C C++ 结构体字节对齐 net
如上所示,将对其方式设为1字节对齐,那么S1不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
空结构体
struct S3 { };
sizeof( S3); // 结果为1
“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也只能为其分配一个字节的空间用于占位了。
有static的结构体
struct S4{
char a;
long b;
static long c; //静态
};
|
静态变量存放在全局数据区内,而sizeof计算栈中分配的空间的大小,故不计算在内,S4的大小为4+4=8。
struct S5{
char c;
int i;
};
struct S6
{
char c1;
S5 s;
char c2
};
|
S5的宽简单成员的类型为int,S6在考虑宽简单类型成员时是将S5“打散”看的,所以S6的宽简单类型为int,这样,通过S6定义的变量,其存储空间首地址需要被4整除,整个sizeof(S6)的值也应该被4整除。c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。后得到sizeof(S6)的值为16。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11