在C++中检查结构是否对齐或包含间隙
Check in C++ that a struct is well aligned or contains gaps
我遇到了一个问题,在编译时,如果结构对齐良好或包含间隙,就应该检查它。检查可以在额外的测试代码中完成,但我不希望在真正的实现代码中"打包"数据。
这是一个示例头文件(MyData.h),具有典型的包含保护:
#ifndef MYDATA_H_
#define MYDATA_H_
struct uneven
{
int bla_u32;
short bla_u16;
char bla_u8;
/* <-- this gap will be filled in the unpacked version */
};
#endif // MYDATA_H
我找到了一个可能的解决方案——见下文。
问题:
有没有一种优雅的方法可以检查结构体
uneven
与编译时未打包的对应结构体相比是否包含不同数量的字节?有没有一个解决方案可以在C中工作(不使用名称空间)?
一个同时适用于C和C++的编译器特定解决方案:GCC有一个警告选项-Wpadded
,它为每个因对齐而更改大小的定义生成一个警告。
您可以使用函数而不是名称空间(在ideone上):
此解决方案也适用于C
头文件:
typedef struct
{
int bla_u32;
short bla_u16;
char bla_u8;
/* <-- this gap will be filled in the unpacked version */
} uneven;
源文件:
#include "MyData.h"
#define StaticAssert(cond, msg) switch(0){case 0:case cond:;}
void checkSizes()
{
uneven unpacked_uneven;
#pragma pack(push, 1)
#undef MYDATA_H_ // force re-including "MyData.h"
#include "MyData.h"
#pragma pack(pop)
uneven packed_uneven;
StaticAssert(sizeof(unpacked_uneven) == sizeof(packed_uneven), "uneven contains gaps");
}
您可以将StaticAssert
放入函数中以处理编译时错误。
我为这个问题找到了一个(不知何故很讨厌,也很棘手)的解决方案,它只适用于C++,而不适用于C.
#define StaticAssert(cond, msg) switch(0){case 0:case cond:;}
#pragma pack(push, 1)
namespace packed
{
#include "MyData.h"
}
#pragma pack(pop)
#undef MYDATA_H_ // force re-including "MyData.h"
#include "MyData.h"
void checkSizes()
{
StaticAssert(sizeof(packed::uneven) == sizeof(uneven), "uneven contains gaps");
}
对于给定的不均匀结构数据,此StaticAssert
宏将失败,因为打包版本的大小为7字节,而未打包(正常)版本为8字节。如果在结构的末尾添加一个额外的char
,则测试成功——那么两个版本都有8个字节。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- C++ 如何格式化包含可变整数的文本行,使其在给定宽度内右对齐?
- 如何将括号与其包含的代码对齐
- 与包含的类型相比,数组在C++中的对齐方式如何?2.
- 对齐包含字符串的数据
- 如何对齐std::数组中包含的数据
- 在C++中检查结构是否对齐或包含间隙