3

在我的网络应用程序中,在接收到的缓冲区中,我想使用偏移量作为指向已知结构的指针。使用 memcpy() 复制结构的每个字段 2 次 (rx/tx) 很繁重。我知道我在 cortex-a8 上的 gcc 4.7.2(选项:-O3)在 1 条指令中执行 memcpy(&a,&buff,4) 未对齐。因此,他可以访问未对齐的 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));
}
4

1 回答 1

3

要指示 GCC 对结构及其成员使用一个字节的对齐方式,请使用 GCCpacked属性,如本页所示。在您的代码中,更改:

struct msg_struct {…}

至:

struct __attribute__ ((__packed__)) msg_struct {…}

您还需要更正指针算法。添加header_sizebuff添加 100 个对象的距离int,因为buff是指向int. 您可能应该将其维护buff为数组,unsigned char而不是int.

于 2013-09-06T23:06:11.513 回答