我有两个单独编译的DLL,一个是从Visual Studio 2008编译的,一个是从matlab编译的mex文件。
这两个 DLL 都有一个包含的头文件。当我在一个 DLL 中获取
sizeof()
结构时,它返回 48,而在另一个 DLL 中则返回 64。
我检查了 /Zp
开关,在两个编译中它都设置为 /Zp8
。编辑
结构如下所示:
class LIBSPEC SGeometry
{
public:
std::vector<IGeometry> m_i;
uint N;
uint n_im, n_s;
};
在调试中,
sizeof()
在两种情况下都返回 56,在发布中,在 mex 编译中为 48,在 VS 中为 64。编辑
用offsetof检查后发现差异在于
std::vector
的大小。在一个 dll 中它是 32,在另一个 dll 中它是 48。好吧,这可能是有史以来最晦涩难懂的事情了。
事实证明,matlab 将
/D_SECURE_SCL=0
添加到编译中,这会禁用称为 '安全迭代器'std::vector
的大小相差 16 个字节
目标平台(例如 32 位与 64 位) /Zp 也可以被 #pragma 语句覆盖。 如果您使用指向结构中成员的指针,则 /vm?选项会影响它们的大小。
类型定义可能会受到不同文件#included 的影响。
我想不出其他任何事情(都不太可能)。
如果您发布结构声明,可能会有所帮助。您还可以对各个元素使用 OFFSETOF 宏和 sizeof() 来详细探索差异。
#pragma pack
,这可能会独立于编译器命令行上的任何内容来更改结构的大小。
导致大小差异的另一件事是,结构声明中使用的任何 typedef 是否可以使用条件编译定义为一种类型或另一种类型。
在我的例子中,
_HAS_EXCEPTIONS=0
导致sizeof(std::exception)
从24字节减少到16字节。