首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“__attribute__((压缩,对齐(4)”是什么意思?

“__attribute__((压缩,对齐(4)”是什么意思?
EN

Stack Overflow用户
提问于 2012-08-02 10:59:31
回答 3查看 185.6K关注 0票数 147

它是由C language.It写成的:

代码语言:javascript
复制
typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-02 14:44:41

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

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

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

为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充

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

代码语言:javascript
复制
typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

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

代码语言:javascript
复制
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

代码语言:javascript
复制
typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

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

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

如果您希望对所有结构执行相同的操作,我们只需使用#pragma将对齐值推送到堆栈

代码语言:javascript
复制
#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)
票数 190
EN

Stack Overflow用户

发布于 2012-08-02 11:03:28

  • packed意味着它将使用尽可能小的struct Ball空间-即,它将在没有padding
  • aligned的情况下将字段塞在一起-意味着每个struct Ball将从4字节边界开始-即,对于任何struct Ball,其地址可以被4

除以

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

票数 103
EN

Stack Overflow用户

发布于 2012-08-02 11:04:46

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

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

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11770451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档