【问题标题】:Why difference between structure variable is always giving 16bytes in 64 bit OS?为什么结构变量之间的差异总是在 64 位操作系统中给出 16 字节?
【发布时间】:2015-11-11 18:56:25
【问题描述】:
#include<stdio.h>

struct std
  {
  char c;
  char e;
};

void main()
  {
  struct std p,q;
  int start,last;
  last= &q;
  start= &p;
  printf("Size:%u %u Address_Diff:%d \n",&p, &q,(last-start) );
}

我正在学习结构对齐和填充,而我们每次执行上面的程序时两个结构变量之间的时间差显示 16 个字节。我不明白为什么差异是 16 个字节,但我希望差异是 2 个字节。

一些例子:

4077309424 4077309440 差异:16

3600238672 3600238688 差异:16

3272011008 3272011024 差异:16

【问题讨论】:

  • 因为填充后的结构体大小为 16 个字节(每个单个字节额外填充 7 个字节)。
  • @EugeneSh。这里显示的结构很可能没有以任何形式填充,并且它的大小为 2,至少在所有常见平台上是这样。

标签: c struct structure


【解决方案1】:

通常编译器可能会填充字节,以保持每个结构变量的起始位置为字或双字对齐。我猜对齐位置的选择可能取决于架构和编译器。

您的编译器似乎为每个结构变量保持 16 字节对齐。有时编译器可能会将字节填充到结构元素中以保持字或双字对齐。您可以检查字节填充发生的位置,我的意思是字节或在元素级别或结构级别填充。

打印每个元素地址(如下所示)并查看它们之间的区别。

printf("Size:%u %u Address_Diff:%d \n",&p.c, &p.e);

如果差异只有一个字节,则表示字节在结构级别填充,即在结构末尾。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2013-10-31
    • 2019-01-03
    • 1970-01-01
    • 2013-07-16
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多