大多数“常见”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限制条件下进行高性能加载的反序列化。除了编写一些使用数据结构对齐信息的自定义工具之外,如果您能想到更好的实现方法,请随时发布。我的投票手指很痒。
答案 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