对象不会打包数据

时间:2012-06-04 21:26:19

标签: c++ clang xcode4.3 memory-alignment

我正在尝试将数据打包到c ++结构中。

我的结构有这样的布局:

struct structName
{
  int16_t member1;
  int32_t member2;
  uint32_t member3;
  uint32_t member4;
  uint32_t member5;
  etc
}__attribute__((packed));

使用offsetof($structname, $membername)我得到了正确的数据偏移量(0,2,6,10,14 ...),但是当我按成员名访问数据时,我得到4字节的数据偏移量(0,4,8,12,16 ...)就好像结构没有打包一样。

} __attribute__((packed));

构建一个struct的正确方法?     。     

1 个答案:

答案 0 :(得分:6)

更新: mydogisbox 写道:

  

对于记录,__attribute__((packed))#pramga pack(1)#pragma pack(push, 1)都有效。

__attribute__((packed)) gcc 扩展程序,受支持。

clang文档说它还支持#pragma pack(...)指令:

  

clang对微软的扩展有一些实验性的支持   Visual C ++;要启用它,请使用-fms-extensions命令行选项。   这是Windows目标的默认设置。请注意,支持是   不完整的;启用Microsoft扩展将默默地删除   构造(包括__declspec和Microsoft样式的asm语句)。

     

clang支持用于控制记录布局的Microsoft #pragma pack功能。

来源:http://clang.llvm.org/docs/UsersManual.html

请说:

#pragma pack(1)
struct my_struct {
    int16_t x;
    // etc.
};

查看它是否有效(如果不使用Windows,则使用-fms-extensions进行编译)。

请注意,以上都是非标准扩展,新的C ++ 11标准有一个新的alignas关键字:http://en.cppreference.com/w/cpp/language/alignas

struct alignas(1) my_struct {
    int16_t x;
    // etc.
};

但它的支持仍然有点粗略。