【发布时间】:2010-12-14 13:33:12
【问题描述】:
我有两个分别编译的 DLL,一个是从 Visual Studio 2008 编译的,一个是从 matlab 编译的 mex 文件。
两个 DLL 都有一个包含的头文件。当我在一个 DLL 中使用 sizeof() 结构时,它返回 48,而在另一个 DLL 中返回 64。
我检查了/Zp 开关,在两个编译中它都设置为/Zp8。
还有哪些其他编译器开关可能会影响结构的大小?
该结构是一个简单的 POCO,没有继承,也没有虚函数。
编辑
结构如下所示:
class LIBSPEC SGeometry
{
public:
std::vector<IGeometry> m_i;
uint N;
uint n_im, n_s;
};
在调试中sizeof() 在两种情况下都返回 56,在发布中,在 mex 编译中为 48,从 VS 为 64。
我可以告诉 matlab 编译 mex 时要使用的确切编译器选项,所以不是这样。
编辑
用offsetof检查后发现区别在于std::vector的大小。在一个 dll 中为 32,在另一个 dll 中为 48。
两个 dll 都是 x64。
【问题讨论】:
-
您确定在构建一个或另一个库时没有编译指示会改变包装吗?
-
另外,显示结构的代码 - 它可能会提供线索。
-
matlab 文档是否建议他们使用什么结构对齐?您可能必须使用适当的#pragmas 来调整 C++ 端的对齐方式。
-
在 MSVC 2008 中,向量是 3 个指针和一个分配器 - 我会看看分配器中可能有什么不同。
标签: c++ struct alignment visual-c++ sizeof