gpt4 book ai didi

c - C中的结构填充

转载 作者:太空狗 更新时间:2023-10-29 16:20:17 26 4
gpt4 key购买 nike

这是一道面试题。直到现在,我曾经认为这些问题纯粹是编译器相关的,不应该让我担心,但现在,我对此很好奇。

假设给你两个结构:

struct A {  
int* a;
char b;
}

和,

struct B {  
char a;
int* b;
}

那么你更喜欢哪一个,为什么?我的回答是这样的(尽管我有点摸不着头脑)第一个结构应该是首选,因为编译器为结构分配空间是字大小的一些倍数(这是指针的大小 - 32 上的 4 个字节)位机器和 64 位机器上的 8 个字节)。因此,对于这两种结构,编译器都会分配 8 个字节(假设它是 32 位机器)。但是,在第一种情况下,填充将在我的所有变量之后完成(即在 a 和 b 之后)。因此,即使有机会 b 得到一些溢出并破坏我的下一个填充字节的值,但我的 a 仍然是安全的。

他似乎不太高兴,并要求第一个结构相对于第二个结构的一个缺点。我没什么好说的。 :D

请帮我解答。

最佳答案

我不认为这些结构有任何优势。这个等式中有一个(!)常数。结构成员的顺序保证与声明的一样。

所以在类似下面的情况下,第二个结构可能有优势,因为它可能有更小的尺寸,但在你的例子中不是,因为它们可能有相同的尺寸:

struct {
char a;
int b;
char c;
} X;

对比

struct {
char a;
char b;
int c;
} Y;

关于下面评论的更多解释:

以下所有内容都不是 100%,但在 32 位系统中构造结构的常见方式,其中 int 是 32 位:

结构 X:

|     |     |     |     |     |     |     |     |     |     |     |     |
char pad pad pad ---------int---------- char pad pad pad = 12 bytes

结构 Y:

|     |     |     |     |     |     |     |     |
char char pad pad ---------int---------- = 8 bytes

关于c - C中的结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com