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

标签 c++ struct padding anonymous

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

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

但我希望 byteknown[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/

相关文章:

c++ - GetDlgItemInt 返回 0

c++ - 为什么这个模板递归无法编译?

c++ - "expected ' : ', ' , ', ' ; ', ' } ' or ' __attribute__ ' before ' { 结构成员函数中的' token"

CSS Div 宽度百分比和填充而不破坏布局

css - ionic 2 : Remove gigantic padding from form elements

c++ - 在 gcc 上使用 addcarry 得到奇怪的优化结果

c++ - 无法编译 OpenGL Superbible 7th 示例(未解析的外部符号)

c++ - 调试时出现错误0xC0000005,但程序和变量在单步执行时有效并成功分配

ios - 是否可以缩短大量不断检查 bool 值的代码

c++ - 填充字节发现以及对数组初始值设定项中多余元素的常见和特殊编译器行为