我在一台32位机器上工作,所以我认为内存对齐应该是4字节.假设我有这个 struct :

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字节.

这意味着您的第一个 struct 与2字节边界对齐.由于每个成员都有2个字节,因此不会在它们之间插入填充.

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

C++相关问答推荐

有关字符数组指针和次指针以及qsort函数中的cmp函数的问题

GCC不警告隐式指针到整数转换'

需要大整数和浮点数.使用long long int和long double

C编译器是否遵循restrict的正式定义?

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

Can函数指针指向C++中具有不同参数连续性的函数

如何在c++中包装返回空*的函数

如何将常量char*复制到char数组

Linux不想运行编译后的文件

`#if`条件中是否允许`sizeof`?

如何在ASM中访问C struct 成员

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

如何计算打印二叉搜索树时每行所需的空间?

C:在编译时构建和使用字符串文字的预处理器宏?

我在反转双向链表时遇到问题

不同原型的危险C函数是可能的

如何在C宏定义中包含双引号?

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

C中的char**v*char[]

在带中断的循环缓冲区中使用 易失性