c++ - 对齐特定 pragma packed struct 成员的内存地址?

标签 c++ gcc

我有一个结构,其中的数据成员具有不同长度的类型(有些是整数,有些是单词,有些只是单个字节)。该结构已打包(使用#pragma pack(1))。

我的问题是:是否可以让结构的数据成员内存地址之一在内存中对齐(例如,地址可以被 16 整除)?

我知道可以使用 attribute 对齐整个结构(或者换句话说,它的第一个成员)。我想知道是否可以对齐特定成员而不仅仅是第一个成员。

基本上我需要打包结构(每个成员都在前一个成员之后没有填充)并且我需要其中一个成员(而不是第一个成员)的地址可以被 16 整除。

最佳答案

似乎没有任何可能将结构与偏移量对齐。您必须自己创建偏移量(填充)。

typedef struct __attribute__((packed)) special_align {
    char misc[3];
    int align_me;
};

typedef struct __attribute__((packed, aligned(16))) pad_container {
    char padding[13];   //16-3
    struct special_align data;
};

当然访问结构会变得更麻烦。 如果您不想手动计算需要多少填充,可以使用 offsetof() 宏。在示例中,offsetof(struct special_align,align_me) 将返回 3,即从对齐大小中减去。 (当然如果offset大于align,就必须使用相应的pad size multiplier。`

 pad_size = (sizeof(special_align) * align_size - offsetof(special_align,align_me)) % align_size;

关于c++ - 对齐特定 pragma packed struct 成员的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26625790/

相关文章:

c++ - 固定大小常量数组的常量数组作为 C++ 中方法的参数

c++ - 因为以下虚函数在一个类中是纯的

c++ - 无法使用结构作为键在 C++ 映射中找到插入的值

gcc - 如何链接到不同目录中没有 lib* 前缀的共享库?

python - 如何使用 gcc 编译和链接 python3 包装函数

gcc - C 如何处理堆栈,这就是导致此问题的原因吗?

c - 禁用硬件预取器的效果未反射(reflect)在访问时间中,未显示访问时间的任何差异

c++ - cv::warpPerspective 只显示变形图像的一部分

c++ - 使用 C++ 创建的 ListView 控件末尾未创建项目

c - 无穷大和 nan 值