对象不会打包数据

object won't pack data

本文关键字:数据 包数据 对象      更新时间:2023-10-16

我正在尝试将数据打包在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));

包装结构的正确方法是什么? . .

更新:mydogisbox 写道:

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

__attribute__((packed))是受支持的 gcc 扩展。

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

Clang对Microsoft扩展有一些实验性支持 视觉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.
};

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