【问题标题】:Why structure padding is not happening properly?为什么结构填充没有正确发生?
【发布时间】:2015-04-25 14:08:57
【问题描述】:
#include<stdio.h>

struct A
{
    char        c;
    double      e;
    int         s;
}A;

int main()
{
    printf("%u\n", sizeof(A));
    return 0;
}

输出16。如果将结构内部填充和结构填充作为一个整体考虑,不应该是24吗?

我正在使用 GCC 4.8.2Ubuntu 14.04 32 位 上编译代码。

【问题讨论】:

  • 为什么应该是24?
  • 1+3pad + 8 + 4 --&gt; 16 4 字节对齐对我来说很好。
  • 我认为 OP 期望 double 对齐 8 个字节。
  • @Mat, 1 字节用于 c + 7 字节填充 + 8 字节用于 e + 4 字节用于 s + 4 字节用于结构对齐,如果我们声明结构数组并希望对齐内部成员对齐案也。如果我错了,请纠正我。

标签: c padding


【解决方案1】:

您的计算假设 double 需要 8 字节对齐。并非所有架构都是如此。

在带有 GCC 的 32 位 x86 Linux 上,double 默认为 4 字节对齐。您可以使用 -malign-double 标志更改它,使其与 8 字节对齐。

所以在 32 位 x86 Linux 上假设默认布局:

char       // 1 byte
           // 3 byte padding
double     // 8 bytes
int        // 4 bytes

所以一共16个字节,中间有3个字节的填充。

Wikipedia 文章 Data structure alignment 在一些编译器/环境中提供了 32 位 x86 和 64 位 x86_64 上各种类型的大小/对齐数字。

【讨论】:

  • 我以前从未听说过字节对齐。为什么 C 结构会这样做?
  • @Patrick,您可以阅读 cpu 如何访问内存。谷歌一下。
  • 添加了维基百科文章的链接。简短版本:CPU 需要这个。未对齐的访问要么不可能要么很慢@PatrickRoberts
  • 所以 GCC 不检查原生对齐应该是什么?
  • @KyleStrand:x86_64 支持对 64 位浮点数的 32 位对齐访问,因此可以正常工作(并且可能在某些程序中节省一些内存)。在某些情况下(CPU 代),这不是最佳的性能(我不知道),如果它对你很重要,你就有这个开关。
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多