检索数据结构对齐信息

时间:2012-05-30 21:21:20

标签: c++ c visual-c++ gcc data-structures

大多数“常见”C / C ++编译器(gcc / g ++,普通智能手机编译器,Visual C ++等)是否有机制可以检索或生成data structure alignment信息? (请注意,该术语包含对齐,填充和排列。)我希望获得此信息,而无需在目标平台上运行任何C / C ++代码。

(例如,可以通过DWARF / DWARF2在支持它的编译器上可靠地获得这些数据吗?)

更新:是的,可以将pahole与gcc一起使用。 (我不得不怀疑这是否适用于mingw32,如果是这样,用于输出DWARF2数据的'-g'标志是否会修改代码生成。)不幸的是,gcc不是我必须支持的唯一编译器。 (Visual C ++是最有可能的第二个候选者。)

更新2:对于Visual C ++ this看起来很有希望。我相信Visual C ++和g ++,Windows,Linux,Mac OS X,iOS和Android NDK都有。

更新3:仅供参考,我获取此类信息的主要原因是避免在CPU限制条件下进行高性能加载的反序列化。除了编写一些使用数据结构对齐信息的自定义工具之外,如果您能想到更好的实现方法,请随时发布。我的投票手指很痒。

1 个答案:

答案 0 :(得分:0)

我不确定其他编译器,但在VC中你可以强制使用pragma进行struct member对齐。实际上,如果您正在编写使用结构的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

See MSDN for more information