它是由C language.It写成的:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;请告诉我它是什么意思,以及如何使用这个关键字。
发布于 2012-08-02 14:44:41
在回答之前,我想给你一些来自维基的数据
Data structure alignment是在计算机内存中排列和访问数据的方式。它由两个独立但相关的问题组成:数据对齐和数据结构填充。
当现代计算机读取或写入内存地址时,它将以字大小的块(例如,32位系统上的4字节块)来执行此操作。数据对齐意味着将数据放在等于字大小的倍数的内存偏移量处,这由于中央处理器处理内存的方式而提高了系统的性能。
为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充。
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)发布于 2012-08-02 11:03:28
packed意味着它将使用尽可能小的struct Ball空间-即,它将在没有paddingaligned的情况下将字段塞在一起-意味着每个struct Ball将从4字节边界开始-即,对于任何struct Ball,其地址可以被4除以
这些都是GCC的扩展,不是任何C标准的一部分。
发布于 2012-08-02 11:04:46
属性packed意味着编译器不会在struct的字段之间添加填充。填充通常用于使字段与其自然大小对齐,因为一些架构会对未对齐的访问施加惩罚,或者根本不允许这样做。
aligned(4)表示该结构应与可被4整除的地址对齐。
https://stackoverflow.com/questions/11770451
复制相似问题