这是 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
这些是 GCC 扩展,不是任何 C 标准的一部分。
属性 packed意味着编译器不会在 struct的字段之间添加空白。填充通常用于使字段与其自然大小对齐,因为有些体系结构会对不对齐的访问施加惩罚,或者根本不允许这样做。
struct
aligned(4)表示该结构应该与可被4整除的地址对齐。
aligned(4)
在回答之前,我想给你一些来自维基的数据
数据结构对齐 是数据在计算机内存中的排列和访问方式。它由两个独立但相关的问题组成: 数据校正和 数据结构填充数据结构填充。
当一台现代计算机读取或写入内存地址时,它会以字大小的块(例如32位系统上的4字节块)来完成。< em > 数据对齐 意味着将数据放在相当于字大小的某个倍数的内存偏移处,这样可以由于 CPU 处理内存的方式而提高系统的性能。
为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开始(< em > 数据结构填充 )之间插入一些无意义的字节。
Gcc 提供了禁用结构填充的功能,即在某些情况下避免这些无意义的字节:
typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }sSampleStruct;
sizeof(sSampleStruct)将是12,而不是8。因为结构填充。默认情况下,在 X86中,结构将被填充为4字节对齐:
sizeof(sSampleStruct)
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 应该是两个幂。参考 给你
__attribute__((packed, aligned(X)))
typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }__attribute__((packed, aligned(1))) sSampleStruct;
所以上面指定的 gcc 属性不允许结构填充。
如果您希望对所有结构执行相同的操作,那么只需使用 #pragma将对齐值推入堆栈即可
#pragma
#pragma pack(push, 1) //Structure 1 ...... //Structure 2 ...... #pragma pack(pop)