【发布时间】:2011-10-21 13:26:35
【问题描述】:
这是一道面试题。到现在为止,我曾经认为这些问题完全取决于编译器,不应该让我担心,但现在我很好奇。
假设你有两个结构:
struct A {
int* a;
char b;
}
和,
struct B {
char a;
int* b;
}
那么你更喜欢哪一个,为什么? 我的回答是这样的(尽管我有点在黑暗中拍摄),应该首选第一个结构,因为编译器为结构分配空间的字大小的倍数(这是指针的大小 - 32 上的 4 个字节)位机器和 64 位机器上的 8 个字节)。因此,对于这两种结构,编译器都会分配 8 个字节(假设它是 32 位机器)。但是,在第一种情况下,填充将在我的所有变量之后完成(即在 a 和 b 之后)。因此,即使有机会 b 得到一些溢出并破坏我的下一个填充字节的值,但我的 a 仍然是安全的。
他似乎不太高兴,并要求第一个结构比第二个结构有一个缺点。我没什么好说的。 :D
请帮我解答。
【问题讨论】:
-
我能想到的唯一一点好处是,如果您稍后添加更多 char 字段,那么对于第一个,您可以在最后添加它们而无需引入额外的填充。除此之外,在我看来,看看你是否有足够的信心坚持没有优势是一个棘手的问题。
-
我不确定我理解你所说的“溢出并破坏我的下一个填充字节”是什么意思。您是否担心堆栈溢出,或者只是超出了 char 的容量?
-
@chris:如果你超过了 char 的容量,它只会绕圈子。我的意思是缓冲区溢出。我实际上并没有考虑太多。:D
-
我猜这可能与机器字中字符的位置有关。 C 规范不保证 char 将映射到内存字的第一个字节,因此它也可以映射到机器字的最后一个字节,从而为任一结构创造优势。