【问题标题】:What is the meaning of "__attribute__((packed, aligned(4))) "“__attribute__((packed,aligned(4)))”是什么意思
【发布时间】:2012-07-31 00:15:08
【问题描述】:

是C语言,是这样写的:

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

请告诉我它是什么意思,以及如何使用这个关键字。

【问题讨论】:

  • 这是一个"type attribute" ..(我在 Google 中发现这个带有“C 属性打包”。当然其他人至少可以做到这一点!)
  • 请参阅this question -- 尽管使用aligned(4),您可能不必担心太多。

标签: c gcc


【解决方案1】:
  • packed 意味着它将为struct Ball 使用尽可能小的空间 - 即它将字段填充在一起而无需填充
  • aligned 表示每个struct Ball 将在 4 字节边界上开始 - 即对于任何 struct Ball,其地址可以除以 4

这些是 GCC 扩展,不是任何 C 标准的一部分。

【讨论】:

  • 你能告诉两者,我们是否只在最后添加字节?
  • “4 字节边界”是什么意思?这是什么意思?
【解决方案2】:

packed 属性表示编译器不会在struct 的字段之间添加填充。填充通常用于使字段与其自然大小对齐,因为某些架构会对未对齐的访问施加惩罚或根本不允许这样做。

aligned(4) 表示该结构应与可被 4 整除的地址对齐。

【讨论】:

  • 你能告诉两者,我们是否只在最后添加字节?
【解决方案3】:

在回答之前,我想给你一些来自维基的数据


数据结构对齐是数据在计算机内存中排列和访问的方式。它由两个独立但相关的问题组成:数据对齐数据结构填充

当现代计算机读取或写入内存地址时,它将以字大小的块(例如 32 位系统上的 4 字节块)执行此操作。 数据对齐意味着将数据放置在等于字大小的某个倍数的内存偏移处,由于 CPU 处理内存的方式,这会提高系统的性能。

为了对齐数据,可能需要在最后一个数据结构的结尾和下一个数据结构的开头之间插入一些无意义的字节,即数据结构填充.


gcc 提供禁用结构填充的功能。即在某些情况下避免这些无意义的字节。考虑以下结构:

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct) 将是 12 而不是 8。因为结构填充。默认情况下,在 X86 中,结构将被填充为 4 字节对齐:

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

我们可以使用__attribute__((packed, aligned(X))) 来坚持特定(X)大小的填充。 X 应该是 2 的幂。参考here

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

所以上面指定的 gcc 属性不允许结构填充。所以大小将是 8 个字节。

如果你想对所有结构做同样的事情,我们可以使用#pragma将对齐值推送到堆栈

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

【讨论】:

  • 如果内存将数据存储在 4 字节块中,那么为什么它不向无符号短字节(其 2 字节长)添加 2 个填充字节?还是编译器只是将填充字节添加到结构的第一个和最后一个成员?你能澄清一下吗?
  • @User 请参考这个。如果还是不清楚,请来求助stackoverflow.com/questions/11772553/…
  • 谁说这些填充字节没有意义,他们不知道未对齐的数据访问是 x86 体系结构的一个奇怪现象。当处理器尝试加载跨越其自然对齐边界的数据(例如整数)时,这些字节是避免异常所必需的。
  • @TanveerBadar 他们的意思是填充字节的 没有意义,而不是它们的存在。
  • 只是为了澄清一下,如果我们在结构的末尾有另一个 char Data5,会有填充吗? (使用“打包,对齐(4)”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2022-01-09
  • 2022-01-22
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
相关资源
最近更新 更多