__attribute__ 的语法为:
__attribute__ ((语法列表))
参数aligned(number) [number为最小对齐的字节数]是用得较多的一个。
另一个是参数packed 表示“使用最小对齐”方式,即对变量是字节对齐,对于域是位对齐。
这个例子稍长了点,不过非常简单:
[root@Kendo develop]# cat align.c
[code]#include <stdio.h>
struct A{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
};
struct B{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned));
struct C{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(1)));
struct D{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(4)));
struct E{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((aligned(8)));
struct F{
char a;
int b;
unsigned short c;
long d;
unsigned long long e;
char f;
}__attribute__((packed));
int main(int argc, char **argv)
{
printf("A = %d, B = %d, C = %d, D = %d, E = %d, F = %d\n",
sizeof(struct A), sizeof(struct B), sizeof(struct C), sizeof(struct D), sizeof(struct E), sizeof(struct F));
return 0;
}[/code]
在一个32位机上运行结果如下:
[code][root@Kendo develop]# gcc -o align align.c
[root@Kendo develop]# ./align
A = 28, B = 32, C = 28, D = 28, E = 32, F = 20[/code]
我们看到,最后一个struct F,1 + 4 + 2 + 4 + 8 + 1 = 20,因为使用了__attribute__((packed)); 来表示以最小方式对齐,所以结果刚好为20。
而第一个struct A,因为什么也没有跟,采用默认处理方式:4(1) + 4 + 4(2) + 4 +8 + 4(1) = 28,括号中是其成员本来的大小。与此相似的是struct D。
接下来看struct E,采用8个字节的方式来对齐:8(1+4+2 ,即a, b, c)+ 8(4, d) + 8 + 8(1, f) = 32。
而在struct C中,试图使用__attribute__((aligned(1))) 来使用1个字节方式的对齐,不过并未如愿,仍然采用了默认4个字节的对齐方式。
在struct B中,aligned没有参数,表示“让编译器根据目标机制采用最大最有益的方式对齐"——当然,最有益应该是运行效率最高吧,呵呵。其结果是与struct E相同。
在对结构的大小并不关注的时候,采用默认对齐方式或者编译器认为最有益的方式是最常见的,然后,对于一些对结构空间大小要求严格,例如定义一个数据包报头的时候,明白结构的对齐方式,就非常有用了。
分享到:
相关推荐
### Attribute详解:深入理解GCC属性 #### 概述 在Linux开发及GCC(GNU Compiler Collection)的使用过程中,深入理解`__...因此,在进行Linux开发或使用GCC进行编译时,熟练掌握`__attribute__`的使用是非常必要的。
GCC编译器在处理结构体对齐时,会综合考虑最大成员的对齐需求、每个成员的对齐规则以及整体结构体的对齐一致性。理解这些规则对于优化代码性能和减小内存消耗至关重要,特别是在处理大量结构体数据或跨平台编程时。...
【__attribute__选项】在GNU编译器中,可以使用`__attribute__((aligned(n)))`来设置自定义的对齐值。例如,如果将上述结构体设置为1字节对齐,编译器将不会添加填充字节,结构体的大小会是15字节。`__attribute__(...
3. **使用GCC扩展属性`__attribute__((aligned(n)))`**:这是一种更为灵活的方式来指定结构体成员的对齐方式。例如,`__attribute__((aligned(16)))`可以让成员变量按照16字节对齐。 4. **使用GCC扩展属性`__...
- **内存分配函数**:例如,`osMemAlloc()` 和 `osMemFree()` 是RTX中常用的内存分配和释放函数,它们在内部会处理对齐问题。 - **数据结构的对齐策略**:实验可能涉及如何在定义结构体时确保成员的8字节对齐,这...
另一种常见的做法是使用`__attribute__((packed))`来指明数据使用最小的对齐方式: ```c struct stu { char sex; int length; char name[10]; } __attribute__((packed)); struct stu my_stu; ``` 这种方式...
- **属性修饰符**:在GCC中,可以使用`__attribute__((aligned(n)))`来指定结构成员对齐在`n`字节边界,而`__attribute__((packed))`则取消结构的默认对齐,按照实际占用字节数对齐。 4. **实例分析**: - 示例1...
另外,如果要强制变量或结构体成员按照最小的对齐方式(即一字节对齐),可以使用__attribute__((packed))属性。这种情况下,所有的对齐要求都会被忽略,变量的存储将紧密排列,不会有任何填充。 在实际编程中,...
- **硬件驱动开发**:在编写与硬件交互的驱动程序时,正确处理对齐可以避免不必要的性能损失或硬件故障。 #### 八、总结 字节对齐对于提高程序的性能和兼容性具有重要意义。理解并合理运用对齐策略是每一位C语言...
在编程中,特别是在C++或C语言中,可以使用__attribute__((aligned(n)))(GCC/Clang)或declspec(align(n))(MSVC)等关键字来指定对齐要求。 最后,我们来看一下“自己实现atoi”(自定义字符串转整数函数)。atoi...
1. 性能提升:对齐可以减少内存访问时间,因为CPU通常更快地处理对齐的数据。 2. 内存浪费:对齐可能导致额外的填充字节,从而增加内存占用。 3. 兼容性问题:不同的平台和编译器可能有不同的对齐策略,这可能导致跨...
我们也可以使用 __attribute__ 选项来设置对齐大小,例如,我们想让刚才的结构按一字节对齐,我们可以这样定义结构体:struct stu{char sex;int length;char name[10];}__attribute__((aligned (1)));struct stu my_...
- ** packing 或 __attribute__((packed))**:在C/C++中,可以通过特殊语法关闭默认对齐,使数据紧凑排列,但这可能会牺牲性能。 **4. 字节对齐的实例分析** 在本次实验中,我们将创建不同类型的结构体,观察并...
结构体内存对齐是计算机科学中...通过使用特定的编译器选项(如GCC的`__attribute__((packed))`或Visual C++的`#pragma pack`),可以调整结构体的对齐方式,但这可能导致与其他平台或编译器的不兼容,因此需谨慎使用。
例如,如果你有一个包含浮点数的结构体,通常需要4字节对齐,但如果使用`__attribute__((aligned(8)))`,则整个结构体会按照8字节对齐。 `__attribute__((packed))`则是用来取消编译器的默认优化对齐,使得结构体...
4. **编译器设置**:编译器通常允许用户通过预处理器宏(如`_declspec(align(n))` in MSVC或`__attribute__((aligned(n)))` in GCC)来设定结构体的对齐要求,默认值可能因平台和编译器而异。 5. **对齐参数和字节...
2. **声明中的类型注解 (Type Attributes)**:GNU C允许在声明中添加类型属性,如`__attribute__((aligned))`用于指定对齐要求,`__attribute__((malloc))`用于表示函数返回的新分配内存,还有`__attribute__((no...
例如,在GCC中,可以使用`__attribute__((packed))`属性来强制取消自动对齐,从而减小结构体的大小。 ```c struct __attribute__((packed)) stu { char ch1; int i; char ch2; }; ``` 这种方式虽然可以减少内存...