c++ 类(结构体)内存的对齐方式

c++ 内存对齐方式其实只要遵守两条定律就行了

当前对齐值

在为结构体或类的数据成员分配内存时,当前的数据成员类型长度为M,指定的对齐值是N,那么当前对齐值就是min(M,N),当前地址要被当前对齐值整除

总体对齐值

如果结构体的数据成员类型的最大值为M,指定的对齐值为N,那么实际的对齐值就是min(M,N),那么结构大小要被总体对齐值能整除

下面看一个例子

#pragma pack(8)
struct {
char c;
int n;
short s;
}

上面指定的对齐值是8
c的当前对齐值是min(1,8) = 1
c [0,1) 大小1
n的当前对齐值是min(4,8) = 4,很明显1除以4,不能整除,所以把n放在地址4上
n [4,8) 大小4
s当前对齐值是min(2,8) = 2
s [8,A) 大小2
结构体的总体对齐值为min(4,8)=4,但是A除以4,不能整除,所以结构体的总大小为C

还有两种特殊的应用场景

数组

当结构体里有数组时,其当前对齐值要为该数组的总体对齐值(元素类型大小),在计算总体对齐值时,该数组的类型大小也要变为总体对齐值

#pragma pack(8)
struct {
char c;
char ary[4];
short s;
}

上面指定的对齐值是8
c的当前对齐值是min(1,8) = 1
c [0,1) 大小1
ary的当前对齐值为它的总体对齐值min(1,8) = 1
n [1,5) 大小4
s当前对齐值是min(2,8) = 2
s [6,8) 大小2
结构体的总体对齐值为min(2,8)=2,8/2,可以整除所以结构体的总大小为8

子结构体

当结构体里有子结构时,其当前对齐值要为子结构体的总体对齐值,在计算总体对齐值时,该子结构体的类型大小也要变为总体对齐值

struct stOne{
char c;
char ary[4];
short s;
}
struct stTwo{
int n;
stOne one;
}

上面指定的对齐值是8
n的当前对齐值是min(4,8) = 4
c [0,4) 大小4
one虽然占8字节,但是他的总体对齐值为2,所以当前对齐值为min(2,8)=2
one [4,C) 大小8

结构体的总体对齐值为min(4,8)=4,C/4,可以整除所以结构体的总大小为C

补充:

c++ 默认对齐值是多少呢?

其他我不知道,vs编译器的默认对齐值就是8

posted @ 2022-08-26 11:52  乘舟凉  阅读(183)  评论(0编辑  收藏  举报