c++ - C 结构中的内存对齐

标签 c++ c memory memory-alignment structure-packing

我在 32 位机器上工作,所以我想内存对齐应该是 4 个字节。假设我有这个结构:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

普通添加的大小是 6 个字节,我想对齐的大小应该是 8,但是 sizeof(myStruct) 返回我 6。

但是,如果我写:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

普通添加大小为10字节,对齐大小应为12,这次sizeof(myStruct) == 12

有人能解释一下有什么区别吗?

最佳答案

至少在大多数机器上,类型只与类型本身一样大的边界对齐[编辑:你不能真正要求任何“更多”对齐,因为你必须能够创建数组,并且您不能将填充插入到数组中]。在您的实现中,short 显然是 2 个字节,而 int 是 4 个字节。

这意味着您的第一个结构与 2 字节边界对齐。由于所有成员都是 2 个字节,因此它们之间没有插入填充。

第二个包含一个 4 字节的项目,它与 4 字节的边界对齐。由于前面有 6 个字节,所以在 v3i 之间插入了 2 个字节的填充,在 short 中给出了 6 个字节的数据,两个字节的填充,以及 int 中另外 4 个字节的数据,总共 12 个。

关于c++ - C 结构中的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5435841/

相关文章:

c - 如何在C、C++中输入1字节整数值

c++ - c++中没有虚函数的多重继承

c++ - MinGW gcc C 编译器工作,但 g++ 不工作

c++ - 处理轮廓中的像素(OpenCV)?

c++ - 有没有办法像系统 ("pause"那样暂停)?

从主函数调用时 C 函数返回不同的值

色键透明度不适用于 SDL_image 和 PNG 文件

c# - Convert.ChangeType() 是创建对象的副本还是返回原始对象的引用?

memory - renderInContext/内存问题

r - 矩阵需要多稀疏才能表示为稀疏?