Class 不同模块 (DLL) 的大小不同。如何以及为什么?

Class size is different across modules (DLLs). How and why?

我有两个 Visual Studio 2015 C++ 项目,即 ABA 被编译为共享库,B 使用它。他们都使用 A.

中定义的 class Foo

问题出现在 B 中的一行,如下所示:

auto p = std::make_shared<Foo>(3);

提高 AccessViolationException.

我意识到 AB 以不同的方式识别 Foo 的大小,这使得 B 中的 Foo 的构造函数遍历了Amake_shared 分配的内存边界。使用 Visual studio 的 Watch window,当 A 模块中的代码为 运行 时,我可以看到 sizeof(Foo) 是 1832,而同一个 watch 条目给出了一个值1813 年,当代码为 B 模块中的 运行 时。

我试图删除两个项目的所有中间文件和输出文件并重建整个解决方案,但没有帮助。

那么,一个class怎么可能出现在不同的模块中呢?什么决定了 class 的内存布局?最后也是最重要的,我该如何解决这个问题?

除非满足以下条件之一,否则您不能从纯粹主义者的角度推断对象大小(或布局):

类型是standard layout type.

关于构建的一切都是不变的 - 特别是编译器标志、使用的编译器、编译器版本等。


Finally and most importantly, how can I fix the problem ?

基本上你有2个选项。

使用标准布局类型确保其构建方式相同。出于这个原因,大多数公开可用的 DLL 或共享库接口在其接口中不使用 高级 类型(即非标准布局),有些甚至保留 compatible code (sometime to actually be compatible with ) .