最近在看linux源码的时候,发现在底层的结构体设计中,经常用到__attribute__((packed)) 参数。刚开始有些不懂,碰巧工作中在做底层方面的设计,对这种设计也有需求,所以就在网上查了些资料,总算有点了解 。
struct test_s
{
char reg;
int test2;
char test1;
}__attribute__((packed)) test_t;
struct test_s
{
char reg;
int test2;
char test1;
}test_t2;
通过使用sizeof对两个结构体分别计算,会发现sizeof(test_t) = 6, sizeof(test_t2) = 12;
造成这种差别的就是因为__attribute__((packed)), 这个修饰符会告诉编译器按照紧凑模式去为结构体分配空间,压缩内存空间,不考虑字节对齐问题,以实际所占的字节数依次分配空间,即对变量设置为以一字节对齐,对域设置为按位对齐。
但是,取值的时候仍然可以使用./->的方式,编译器会自动去寻找指定的字段,不会存在字节错误的问题。
另外,在编程的时候,在定义结构体的时候,经常会看到#program pack(push)这种语句,这个是将当前的对齐方式压入栈。
#program pack(push,1)
struct test_s
{
char reg;
int test2;
char test1;
}test_t2;
#program pop()
#program pack(push, 1)相当于将当前的对齐方式压入栈,并设置当前的对齐方式为1,即以一字节对齐。
这相当于
#program pack(push) //将当前对齐方式压入栈
#program pack(1) //设置当前的对齐方式为1
#program pop() 是恢复栈顶的对齐方式,即刚刚压入栈 的。 与push对应使用。
该段代码中,在定义test_t2的时候,以一字节的方式对齐,在定义完成后,恢复编辑器默认的对齐方式,一般为四字节方式对齐。
这个修饰符经常在嵌入式设备或是底层设备程序总较为常见,对内存空间要求较高,需要精打细算的。
这个好像是gcc语法的一个特色,不知道在其他平台上会不会出现编译问题。
__attribute__((packed)) 学
最新推荐文章于 2024-07-25 23:36:45 发布