gpt4 book ai didi

c++ - 对象不会打包数据

转载 作者:行者123 更新时间:2023-11-30 00:56:09 25 4
gpt4 key购买 nike

我正在尝试将数据打包到 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 . . .),但是当我访问数据时member-name 我在 4 字节偏移量(0、4、8、12、16 . . .)处获取数据,就好像结构没有打包一样。

} __attribute__((packed));

打包结构的正确方法? . .

最佳答案

更新:mydogisbox 写道:

For the record, __attribute__((packed)), #pramga pack(1) and #pragma pack(push, 1) all worked.

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

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

clang has some experimental support for extensions from Microsoft Visual C++; to enable it, use the -fms-extensions command-line option. This is the default for Windows targets. Note that the support is incomplete; enabling Microsoft extensions will silently drop certain constructs (including __declspec and Microsoft-style asm statements).

clang supports the Microsoft #pragma pack feature for controlling record layout.

来源: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.
};

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

关于c++ - 对象不会打包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com