c - C中的结构填充

标签 c structure padding

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

假设给你两个结构:

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/

相关文章:

javascript - 更改 Dojo ToolTipDialog 的填充

css - 图像占据了两个图像之间不必要的填充和边距或空间

c++ - 将 .FLV 文件转换为 MP3

c - 有什么方法可以扰乱 Windows 中的 TCP 堆栈吗?

vb.net - 调用类与结构时抛出错误

java - 在单个结构中插入多个 ArrayList

css - 添加 1px 填充会导致外部 div 包含子边距

c - 如何检查位图数组中是否至少有一个元素不为零?

C++ 获取错误 C2440

c - C中结构体的全局变量声明