Class 不同模块 (DLL) 的大小不同。如何以及为什么?
Class size is different across modules (DLLs). How and why?
我有两个 Visual Studio 2015 C++ 项目,即 A
和 B
。 A
被编译为共享库,B
使用它。他们都使用 A
.
中定义的 class Foo
问题出现在 B
中的一行,如下所示:
auto p = std::make_shared<Foo>(3);
提高 AccessViolationException
.
我意识到 A
和 B
以不同的方式识别 Foo
的大小,这使得 B
中的 Foo
的构造函数遍历了A
的 make_shared
分配的内存边界。使用 Visual studio 的 Watch window,当 A
模块中的代码为 运行 时,我可以看到 sizeof(Foo)
是 1832,而同一个 watch 条目给出了一个值1813 年,当代码为 B
模块中的 运行 时。
我试图删除两个项目的所有中间文件和输出文件并重建整个解决方案,但没有帮助。
那么,一个class怎么可能出现在不同的模块中呢?什么决定了 class 的内存布局?最后也是最重要的,我该如何解决这个问题?
我有两个 Visual Studio 2015 C++ 项目,即 A
和 B
。 A
被编译为共享库,B
使用它。他们都使用 A
.
Foo
问题出现在 B
中的一行,如下所示:
auto p = std::make_shared<Foo>(3);
提高 AccessViolationException
.
我意识到 A
和 B
以不同的方式识别 Foo
的大小,这使得 B
中的 Foo
的构造函数遍历了A
的 make_shared
分配的内存边界。使用 Visual studio 的 Watch window,当 A
模块中的代码为 运行 时,我可以看到 sizeof(Foo)
是 1832,而同一个 watch 条目给出了一个值1813 年,当代码为 B
模块中的 运行 时。
我试图删除两个项目的所有中间文件和输出文件并重建整个解决方案,但没有帮助。
那么,一个class怎么可能出现在不同的模块中呢?什么决定了 class 的内存布局?最后也是最重要的,我该如何解决这个问题?