Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “是什么意思?”__属性(“压缩、对齐(4))”;_C_Gcc - Fatal编程技术网

C “是什么意思?”__属性(“压缩、对齐(4))”;

C “是什么意思?”__属性(“压缩、对齐(4))”;,c,gcc,C,Gcc,它是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; 请告诉我它是什么意思,以及如何使用这个关键字 packed意味着它将为struct

它是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;
请告诉我它是什么意思,以及如何使用这个关键字

  • packed
    意味着它将为
    struct Ball
    使用尽可能小的空间,也就是说,它将在不填充的情况下将字段填充在一起
  • aligned
    表示每个
    struct Ball
    将从4字节边界开始-即,对于任何
    struct Ball
    ,其地址可以除以4

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

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


aligned(4)
意味着结构应该与一个可以被4整除的地址对齐。

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


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

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

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


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

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;
我们可以使用
\uuuuuu属性(打包、对齐(X))
来坚持特定(X)大小的填充。X应该是二的幂。提及

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

如果您希望对所有结构执行相同的操作,只需使用
#pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

这是一个。。(我在谷歌的“C属性压缩”中发现了这一点。当然其他人至少也能做到这一点!)看——尽管使用
aligned(4)
你可能不需要太担心。如果内存将数据存储在4字节块中,那么为什么不在无符号短(2字节长)中添加2个填充字节呢?或者编译器只是将填充字节添加到结构的第一个和最后一个成员?您能澄清一下吗。@请用户也参考一下。如果您仍然不清楚,plz来寻求帮助谁说这些填充字节是没有意义的不知道错位数据访问是一个奇怪的x86架构。当处理器试图加载(比如整数)跨越其自然对齐边界的数据时,这些字节是必要的,以避免出现异常。@TanveerBadar他们的意思是填充字节的值没有意义,而不是它们的存在。
#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)