在我的网络应用程序中,在收到的缓冲区中,我想使用偏移量作为指向已知结构的指针。 使用memcpy()2次(rx / tx)复制结构的每个字段都很重。 我知道我的gcc 4.7.2(选项:-O3)在cortex-a8上,在1条指令中做了memcpy(& a,& buff,4)未对齐。 所以,他可以访问unaligned int。 假设它可能有很多结构或大结构。 最好的方法是什么?
struct __attribute__ ((__packed__)) msg_struct {
int a; //0 offset
char b; //4 offset
int c; //5 offset
int d[100]; //9 offset
}
char buff[1000];// [0]:header_size [1-header_size]:header [header_size+1]msg_struct
func() {
struct msg_struct *msg;
recv ((void *)buff, sizeof(buff));
msg=buff+header_size; // so, it is unaligned.
...
// some work like:
int valueRcv=msg->c;
//or modify buff before send
msg->c=12;
send(buff,sizeof(buff));
}
答案 0 :(得分:3)
要指示GCC对结构及其成员使用一个字节的对齐方式,请使用this page上显示的GCC packed
属性。在您的代码中,更改:
struct msg_struct {…}
为:
struct __attribute__ ((__packed__)) msg_struct {…}
您还需要更正指针算法。将header_size
添加到buff
会增加100 int
个对象的距离,因为buff
是指向int
的指针。您应该将buff
维护为unsigned char
而非int
的数组。