【问题标题】:Figuring out the size of a struct in C (data alignment issue)计算 C 中结构的大小(数据对齐问题)
【发布时间】:2014-02-09 15:26:18
【问题描述】:

考虑以下代码段:

struct MixedData {
    char a;
    short b;
    char c;
    long d;
    char e;
};

int main() {
    cout<<sizeof(MixedData)<<endl;
}

(忽略 C++ 语法,因为这里不是问题)
这段代码的输出是 24,我不太明白为什么。
我将表示:
C: char
S: 短
L: 长
P:编译器填充
和每个 | |是一个字节。
据我所知,数据对齐方式是:

|C|P|S|S|C|P|P|P|L|L|L|L|L|L|L|L|C|P|P|P|

所以输出应该是 20,不是吗? 有趣的是,当 MixedData 变成:

struct MixedData {
    char a;
    short b;
    char c;
    int d;
    char e;
};

大小变为 16,应该是这样。
有人对此有解释吗?

【问题讨论】:

  • 你平台上的sizeof(long)是什么?
  • 8 个字节。已经检查过了。

标签: c struct alignment primitive-types


【解决方案1】:

如果你的“long”是 8 个字节,会发生什么:

C P S S C P P P L L L L L L L L C P P P P P P P P

最后 4 个填充字节使结构总大小达到 8 个字节的倍数。

如果您想知道为什么会这样,那是因为您希望对每个结构成员的访问进行对齐。您的平台显然是 64 位(8 字节)。如果我们没有最后 4 个填充字节,则结构数组将是:

C P S S C P P P L L L L L L L L C P P P | C P S S C P P P L L L L L L L L C P P P | ...

请注意,第二个 long 值被分成 2 个不同的 8 字节块!它位于数组开头的偏移量 28 处,8 字节块从 24 和 32 开始...

出于同样的原因,char a;长 b;将是 16 个字节 - char 将被填充到 8 个字节以将 long 保持在 8 个字节的边界。

【讨论】:

  • 所以每当我的结构中有一个“long”时,编译器会将其边界填充为 8 的倍数?
  • 是的。尝试例如: int a;诠释 b;字符 c;.这将是 4I+4I+1C+3P。然而,长了一个;字符 c;将是 8L+1C+7P。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2015-06-03
  • 2013-06-03
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多