检索数据结构对齐信息
Retrieving data structure alignment information
大多数"常见"C/C++编译器(用于gcc/g++,用于普通智能手机的编译器,Visual C++等)中是否有一种机制可用于检索或生成数据结构对齐信息?(请注意,此术语包括对齐、填充和排列。我希望无需在目标平台上运行任何 C/C++ 代码即可获取此信息。
(例如,这些数据能否通过DWARF/DWARF2可靠地在支持它的编译器上获得?
更新:是的,可以将pahole与gcc一起使用。(我不得不怀疑这是否适用于 mingw32,如果是,用于输出 DWARF2 数据的"-g"标志是否会修改代码生成。不幸的是,gcc 并不是我必须支持的唯一编译器。(视觉C++最有可能是第二个候选者。
更新2:对于视觉C++这看起来很有希望。我相信在Visual C++和g++之间,Windows,Linux,Mac OS X,iOS和Android NDK都包括在内。
更新3:仅供参考,我获取此类信息的主要原因是避免在CPU受限条件下进行反序列化以实现高性能加载。如果您能想到比编写一些使用数据结构对齐信息的自定义工具更好的方法来实现这一目标,请随时发布。我的投票手指很痒。
十年后的更新 4:我的一个朋友使用现代语言功能(C++20 及更高版本)创建了一个C++库,有助于以实际跨平台的方式制作零指令可序列化结构:https://github.com/KaylinFinke/data_serialization/tree/main。这本来可以解决我最初的需求,所以我想我会在这里让其他人知道。
我不确定其他编译器,但在 VC 中,您可以使用杂注强制结构成员对齐。事实上,如果要编写使用结构的 IPC 机制,则应以编程方式强制对齐两个进程使用的任何声明。这样,如果任一应用程序偏离标准结构成员对齐方式,则可以消除出错的可能性。
#pragma pack(push, 1) // forces 1 byte alignment
typedef struct
{
int sample;
char sample2;
}FIVE_BYTES;
#pragma pack(pop) // returns to whatever alignment was in use prior to the push
有关详细信息,请参阅 MSDN
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 检索数据结构对齐信息