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

1 回答 1

7

这是填充标准说在结构内或末尾可能有未命名的填充,但在开始时没有。C99 标准草案的6.7.2.1 结构和联合说明符13段说:

[...]结构对象中可能有未命名的填充,但不是在其开头。

15段说:

在结构或联合的末尾可能有未命名的填充。

于 2013-11-13T13:19:05.567 回答