C语言之GCC中支持的内存对齐指令
作者:网络转载 发布时间:[ 2016/11/10 11:41:48 ] 推荐标签:.NET 内存 运算符
下面解释一下其中的几个结构体字节分配的情况
比如对于node2
typedef struct node2
{
char a;
int b;
short c;
}S2;
sizeof(S2)=12;
对于变量a,它的自身对齐参数为1,#pragma pack(n)默认值为8,则终a的对齐参数为1,为其分配1字节的空间,它相对于结构体起始地址的偏移量为0,能被4整除;
对于变量b,它的自身对齐参数为4,#pragma pack(n)默认值为8,则终b的对齐参数为4,接下来的地址相对于结构体的起始地址的偏移量为1,1不能够整除4,所以需要在a后面填充3字节使得偏移量达到4,然后再为b分配4字节的空间;
对于变量c,它的自身对齐参数为2,#pragma pack(n)默认值为8,则终c的对齐参数为2,而接下来的地址相对于结构体的起始地址的偏移量为8,能整除2,所以直接为c分配2字节的空间。
此时结构体所占的字节数为1+3+4+2=10字节
后由于a,b,c的终对齐参数分别为1,4,2,大为4,#pragma pack(n)的默认值为8,则结构体变量后的大小必须能被4整除。而10不能够整除4,所以需要在后面填充2字节达到12字节。其存储如下:
|char|----|----|----| 4字节
|--------int--------| 4字节
|--short--|----|----| 4字节
总共占12个字节
对于node3,含有静态数据成员
typedef struct node3
{
int a;
short b;
static int c;
}S3;
则sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
|--------int--------| 4字节
|--short-|----|----| 4字节
而变量c是单独存放在静态数据区的,因此用siezof计算其大小时没有将c所占的空间计算进来。
而对于node5,里面含有结构体变量
typedef struct node5
{
bool a;
S1 s1;
double b;
int c;
}S5;
sizeof(S5)=32。
对于变量a,其自身对齐参数为1,#pragma pack(n)为8,则a的终对齐参数为1,为它分配1字节的空间,它相对于结构体起始地址的偏移量为0,能被1整除;
对于s1,它的自身对齐参数为4(对于结构体变量,它的自身对齐参数为它里面各个变量终对齐参数的大值),#pragma pack(n)为8,所以s1的终对齐参数为4,接下来的地址相对于结构体起始地址的偏移量为1,不能被4整除,所以需要在a后面填充3字节达到4,为其分配8字节的空间;
对于变量b,它的自身对齐参数为8,#pragma pack(n)的默认值为8,则b的终对齐参数为8,接下来的地址相对于结构体起始地址的偏移量为12,不能被8整除,所以需要在s1后面填充4字节达到16,再为b分配8字节的空间;
对于变量c,它的自身对齐参数为4,#pragma pack(n)的默认值为8,则c的终对齐参数为4,接下来相对于结构体其实地址的偏移量为24,能够被4整除,所以直接为c分配4字节的空间。
此时结构体所占字节数为1+3+8+4+8+4=28字节。
对于整个结构体来说,各个变量的终对齐参数为1,4,8,4,大值为8,#pragma pack(n)默认值为8,所以终结构体的大小必须是8的倍数,因此需要在后面填充4字节达到32字节。其存储如下:
|--------bool--------| 4字节
|---------s1---------| 8字节
|--------------------| 4字节
|--------double------| 8字节
|----int----|---------| 8字节
另外可以显示地在程序中使用#pragma pack(n)来设置系统默认的对齐参数,在显示设置之后,则以设置的值作为标准,其它的和上面所讲的类似,不再赘述了,读者可以自行上机试验一下。如果需要取消设置,可以用#pragma pack()来取消。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
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热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南