对象不会打包数据

N_A*_*N_A 1 c++ clang memory-alignment xcode4.3

我正在尝试在c ++结构中打包数据.

我的结构有这样的布局:

struct structName
{
  int16_t member1;
  int32_t member2;
  uint32_t member3;
  uint32_t member4;
  uint32_t member5;
  etc
}__attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

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

} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

构建一个struct的正确方法是什么?..

Qua*_*key 6

更新:mydogisbox写道:

根据记录,__attribute__((packed)),#pramga pack(1)#pragma pack(push, 1)所有的工作.

__attribute__((packed))是一个gcc扩展,支持.

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

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

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

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

说啊:

#pragma pack(1)
struct my_struct {
    int16_t x;
    // etc.
};
Run Code Online (Sandbox Code Playgroud)

看它是否有效(-fms-extensions如果不使用Windows则编译).

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

struct alignas(1) my_struct {
    int16_t x;
    // etc.
};
Run Code Online (Sandbox Code Playgroud)

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