gpt4 book ai didi

c++ - 不同编译器的 C++ 类型的大小

转载 作者:行者123 更新时间:2023-11-30 02:43:33 25 4
gpt4 key购买 nike

我想避免陷入XY trap所以这是原来的问题:

我们有一个在 PC 上创建共享内存段的小程序。该程序通过从其头文件(一堆单独和嵌套的结构定义)中读取其结构来创建它。基本上只是一个 .h 和一个 .cpp 文件。该程序将由 g++ 编译。

我们想创建另一个程序,一个共享内存查看器,它以 TreeView 显示此内存的布局。为此,我们必须解析前面提到的头文件并计算偏移量以读取/操作共享内存特定部分的内容。如果没有必要,我们不想编写解析器,特别是因为头文件也包含额外的声明和定义。该程序将由与前一个程序相同版本的 g++ 编译。

本来我们想在第二个程序中使用gccxml来解析头文件,但它是基于4.2 gcc的,无法解析包含C++11代码的头文件。另一个想法是使用 libclang 来获取该头文件的结构。 libclang 也包含大小信息,但我不知道在 g++ 和 clang 的情况下,类型和填充/对齐的大小是否相同。

我的问题是:当您使用 clang 和 g++ 编译代码时,您能否假设 C++ 类型的大小和结构的填充/对齐相同?环境(PC、操作系统)相同。恐怕我们不能,因为 C++ 标准没有指定类型的确切大小。

你知道原始问题的另一种解决方案吗?

最佳答案

简短回答:由于 clang 的目标是“与 gcc 兼容”(对于 C 和 C++),我想说您可以期望它为相同的代码生成相同的偏移量和大小。

长答案:假设您只使用基本类型(intshortdoublechar 和指向这些类型的指针),并且我们限制使用 gcc 和 clang(以及它们的 C++ 版本),保持相同的操作系统和相同的位数(“双方”为 32 位或 64 位),然后根据编译器中的实际错误,它应该有相同的结构布局。

当然,这是一长串限制,当然,在这些情况下,“受实际错误影响”是一个永无止境的问题。

如果您使用定义的大小类型,例如 uint32_t 而不是 int,您可以使您的案例更容易一些 - 相反,如果您将类成员放入结构中,它有虚拟成员,你会遇到严重的麻烦 - 但无论如何它不能很好地与共享内存一起工作,因为它不能保证在不同的应用程序中位于同一位置。

警惕 STL 功能 - 您可能不会为两个编译器获得相同的 C++ 库(您可能会或可能不会,具体取决于您的安装方式)。

我会仔细检查,通过添加一些代码来打印重要成员的偏移量和大小(当然,并使用两个编译器运行)——不要忘记对某些结构深处的成员执行此操作,因为它可以很可能一个结构的整体大小可以相同,而内容可以有不同的偏移量。

(正如其他人所说,我看到一些项目使用打印结构成员偏移量的脚本生成一些代码,并将其用作项目中其他程序的输入)

关于c++ - 不同编译器的 C++ 类型的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26054321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com