What's this: __attribute__((packed))

Here is how I think it works (please correct me if I'm wrong!)

__attribute__((packed)) ensures that structure fields align on one-byte boundaries. If you want to ensure that your structures have the same size on all processors, the packed attribute is how you tell gcc.

As an example, let's define this structure:

Code:
struct s {
char aChar;
int anInt;
};

A processor that aligns on eight-byte boundaries may compile this so that aChar is in the first byte, followed by seven bytes of unused space, then starting anInt in the ninth byte.

A processor that aligns on four-byte boundaries may compile this so that aChar is in the first byte, followed by three bytes of unused space, then starting anInt in the fifth byte.

To force anInt to begin immediately after aChar, you would define the structure like this:

Code:
struct s {
char aChar;
int anInt __attribute__((packed));
};

To test these ideas out, I ran this code on an old Pentium 166:

Code:
#include <stdio.h>

struct s1 {
char a;
int i;
};

struct s2 {
char a;
int i __attribute__((packed));
};

int main( int argc, char* argv[] ) {

struct s1 s_1;
struct s2 s_2;

printf( "sizeof s1 is %d/n" , sizeof(s_1) );
printf( "sizeof s2 is %d/n" , sizeof(s_2) );

return( 0 );
}

And got these results:

Code:
eric.r.turner@turing:~/lab/packed$ ./foo
sizeof s1 is 8
sizeof s2 is 5

Looks like this processor aligns on four-byte boundaries.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值