C++内存对齐问题

理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。看代码如下:

#include<stdio.h>
struct{
    int x;
    char y;
}s;

int main()
{
    printf("%d\n",sizeof(s);  // 输出8
    return 0;
}

现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。
有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位

个人理解
在这里插入图片描述
图片中的三个图片分别代表下面代码中X1,X2,X3结构的内存图

#include<stdio.h>
struct
{
    int i;    
    char c1;  
    char c2;  
}x1;

struct{
    char c1;  
    int i;    
    char c2;  
}x2;

struct{
    char c1;  
    char c2; 
    int i;    
}x3;

int main()
{
    printf("%d\n",sizeof(x1));  // 输出8
    printf("%d\n",sizeof(x2));  // 输出12
    printf("%d\n",sizeof(x3));  // 输出8
    return 0;
}

如X1,i的内存是4,占满了对齐单位4,所以下面的C1,C2就进入下一个长度为4单元,C1+C2的内存长度都不到4,所以X1结构体的长度就是8,而X2中,第一个元素C1的内存长度为1,第二个元素的长度为4,4+1=5,超过了对齐单位,所以i放第二个内存单元,第三个元素放到下面的内存单元,所以整个结构体长度为8
参考的是这篇文章,链接是微信文章

发布了9 篇原创文章 · 获赞 0 · 访问量 253

猜你喜欢

转载自blog.csdn.net/a_465240/article/details/104584289