讨论/《C++ 面试突击》 - 内存对齐/
《C++ 面试突击》 - 内存对齐
共 13 个回复

在忽略硬件影响的情况下,为什么要进行内存对齐:
提升内存的访问效率,因为cpu在读取内存时,是一块一块的读取

2

string 对象的字节数,是不是不同平台的编译器字节数不同呢,vs2019 x86下string对象28字节,x64下是40字节。

1

对其基数不同平台不同,这个例子里的应该是4 bytes。你指出的这一行为了把var1的offset填充为4的倍数,需要2(填充)。

补充一个点:
struct D{
char a;
int b;
static double c; //静态成员
};
win32系统
静态成员变量存放在全局数据区内,在编译的时候已经分配好内存空间,所以对结构体的总内存大小不做任何贡献;因此,sizeof(D)=4+4=8个字节

不是啊,你这个机器的对齐基数是固定的,

“其最宽基本类型成员大小与对齐基数中的较小者所整除”
感觉不大理解,例子中,short长度是2,此时对齐基数是2;int是4,此时对齐基数是4,总长度为8,那么不应该是按“最宽基本类型成员大小与对齐基数中的较大者”吗

请问对其基数是指什么?
以及这一行为什么这么填充呢?

 int var1;  // 8 字节 (内存对齐原则:填充 2 个字节) 2 (short) + 2 (填充) + 4 (int)= 8

linux下
long在64位下是8字节吧,32位下是4字节
指针也是64位下是8字节,32位下是4字节
在 64 位 Linux 下,结构体字段默认按 8 字节对齐;32 位 Linux 下,默认 4 字节对齐
编者应该是在window下的吧

该内容已被删除

写得好,然而1字节不是8位嘛

结构体每个成员相对于结构体首地址的偏移量 (offset) 都是该成员大小与对齐基数中的较小者的整数倍