gcc __attribute__((packed))
时间: 2023-10-30 11:03:15 浏览: 113
gcc中的`__attribute__((packed))`是一个编译器特性,用于指示编译器对结构体或联合体使用紧凑的内存布局,即取消字节对齐。
当使用`__attribute__((packed))`修饰结构体或联合体时,编译器将取消默认的字节对齐规则,按照实际变量的顺序进行内存布局,不插入任何填充字节。这可以减小结构体或联合体在内存中的占用空间,但也可能导致访问未对齐的内存地址,引发潜在的问题。
下面是一个示例:
```c
#include <stdio.h>
struct MyStruct {
char a;
int b;
};
int main() {
struct MyStruct s;
printf("Size of MyStruct: %zu\n", sizeof(s));
return 0;
}
```
默认情况下,`int`类型通常需要按照4字节对齐,所以`MyStruct`的大小应该是8字节(1字节的`char` + 3字节的填充 + 4字节的`int`)。但是,如果我们在结构体声明前加上`__attribute__((packed))`:
```c
struct __attribute__((packed)) MyStruct {
char a;
int b;
};
```
那么,编译器将取消默认的字节对齐规则,使得`s`的大小为5字节(1字节的`char` + 4字节的`int`)。
需要注意的是,使用`__attribute__((packed))`可能会导致性能下降,因为对未对齐的内存地址进行访问可能会增加额外的开销。此外,使用该特性可能与特定体系结构或编译器有关,因此在跨平台或可移植性要求较高的代码中,最好谨慎使用。
阅读全文