C语言 检索数据结构对齐信息

anauzrmj  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(105)

在大多数“常见”C/C编译器(gcc/g、常见智能手机编译器、Visual C等)中是否有一种机制可以检索或生成data structure alignment信息?(注意,这个术语包括对齐、填充和排列。)我希望获得这些信息,而不需要在目标平台上运行任何C/C代码。
(E.g.这样的数据可以通过DWARF/DWARF 2在支持它的编译器上可靠地获得吗?)

**更新:**可以,pahole可以和gcc一起使用。(我想知道这是否适用于mingw 32,如果适用,用于输出DWARF 2数据的'-g'标志是否会修改代码生成。)不幸的是,gcc不是我必须支持的唯一编译器。(Visual C是最有可能的第二个候选者。
**更新2:**对于Visual C
this看起来很有希望。我相信在Visual C和g之间,涵盖了Windows,Linux,Mac OS X,iOS和Android NDK。
**更新3:**仅供参考,我获取这些信息的主要原因是为了避免在CPU受限的情况下进行高性能加载的反序列化。如果你能想到一个更好的方法来实现这一目标,而不是编写一些使用数据结构对齐信息的自定义工具,请随时发布。我的投票手指很痒。
十年后更新4:我的一个朋友创建了一个C库,使用现代语言功能(C20和更高版本),有助于以实际跨平台的方式制作零指令可序列化的结构:https://github.com/KaylinFinke/data_serialization/tree/main。这将解决我最初的需要早在一天,所以我想我会让别人知道它在这里。

3ks5zfa0

3ks5zfa01#

我不确定其他的编译器,但是在VC中你可以用pragma强制结构成员对齐。事实上,如果你正在编写一个使用结构体的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

相关问题