C语言中带指针的结构体的内存开销

5

我发现当结构体包含指针时会有内存开销。以下是一个例子:

typedef struct {
    int num1;
    int num2;
} myStruct1;

typedef struct {
    int *p;
    int num2;
} myStruct2;

int main()
{
    printf("Sizes: int: %lu, int*: %lu, myStruct1: %lu, myStruct2: %lu\n", sizeof(int), 
        sizeof(int*), sizeof(myStruct1), sizeof(myStruct2));
    return 0;
}

这在我的64位机器上打印出以下内容:

Sizes: int: 4, int*: 8, myStruct1: 8, myStruct2: 16

除了myStruct2的大小,其他所有东西都对我来说很有意义,我认为它只会是12而不是16(sizeof(int*) + sizeof(int) = 12)。
有人能解释一下这是为什么吗? 谢谢!
(我相当确定这一定已经在其他地方问过了,但我找不到。)

4
8字节对齐可能吗? - Roger Rowland
请问您能指定对齐的编译器设置吗? - Dewfy
我认为这不是8字节对齐,因为一个包含恰好3个整数的结构体的大小是12。 - Oriol Nieto
1个回答

7
这里涉及到的是填充(padding)问题。标准规定,在结构体中或者结构体末尾可以存在未命名的填充(padding),但在开头不行。C99标准草案第6.7.2.1节“结构和联合说明符”第13段明确提出:
[...]一个结构对象内可以有未命名的填充,但不能在其开头处。
第15段则指出:
一个结构体或联合体末尾可能会有未命名的填充。请注意,上述内容中的HTML标签已被保留。

耶,谢谢!现在我很好奇:为什么会发生这种情况? - Oriol Nieto
1
据我所知,这通常涉及内存对齐,而数据结构填充部分更为相关。 - Shafik Yaghmour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接