gpt4 book ai didi

c++ - 如何在结构中声明填充?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:44 26 4
gpt4 key购买 nike

我在内存中有一个结构,但并非所有成员都是已知的(这个结构是逆向工程的)。我想要做的是在内存中有这样的表示:

struct Name {
long Id;
byte unknown[32];
float X;
};

但我希望byte unknown[32] 不可见,所以当我使用Name 类型的内容时,我只能看到 2 个变量 Id 和 X。我认为它类似于:

struct Name {
long Id;
byte : 32*8; // So this doesn't appear
float X;
};

但这不起作用 1. 因为我每行限制为 8 个字节,所以它必须看起来像:

struct Name {
long Id;
long long : 64;
long long : 64;
long long : 64;
long long : 64;
float X;
};

其次,当我实际尝试这样做时,它并没有按预期工作(访问 X 并不引用结构的偏移量 0x24)。

最佳答案

你走在正确的轨道上,但你只是在细节上错了。编译器将对齐填充插入到您的 Name 版本中。这个程序可能会做你想做的事:

#include <cstddef>
#include <iostream>
#include <cassert>

struct Name {
long Id; // offset 0x00
int : 32; // offset 0x04
long long : 64; // 0x08
long long : 64; // 0x10
long long : 64; // 0x18
int : 32; // offset 0x20
float X; // offset 0x24
};

int main () {
assert(sizeof(int) == 4);
assert(sizeof(long) == 4);
assert(sizeof(float) == 4);
assert(sizeof(long long) == 8);
assert(offsetof(Name, Id) == 0);
assert(offsetof(Name, X) == 0x24);
}

或者,您可以调查#pragma pack

注意:对于您的问题,没有可移植的、经过标准认可的解决方案。编译器可以(几乎)在他们选择的任何地方自由插入填充字节。但可能存在不可移植的、编译器认可的解决方案,例如上面的两个。

关于c++ - 如何在结构中声明填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10706602/

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