4

我有两个分别编译的 DLL,一个是从 Visual Studio 2008 编译的,一个是从 matlab 编译的 mex 文件。
两个 DLL 都有一个包含的头文件。当我sizeof()在一个 DLL 中获取结构时,它返回 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,在另一个中是 48。
两个 dll 都是 x64。

4

4 回答 4

5

好的,所以这可能是有史以来最模糊的事情。
事实证明,matlab 添加/D_SECURE_SCL=0到编译中会禁用称为“安全迭代器”的
东西, 这反过来会导致 16 个字节的大小差异std::vector

于 2009-11-09T09:58:50.490 回答
2
  • 检查包含路径和库路径中的差异
  • 检查定义的预处理器符号的差异
  • 检查项目设置中的任何差异(代码生成、链接等)
  • 是否在同一台机器上使用相同的 IDE 编译两个版本?
于 2009-11-09T09:43:01.727 回答
1

目标平台(例如 32 位与 64 位) 另外 /Zp 可以被#pragma 语句覆盖。如果使用指向结构中成员的指针,/vm? 选项会影响它们的大小。

类型定义可能会受到不同文件#included 的影响。

我想不出其他任何事情(都不太可能)。

如果您发布结构声明,它可能会有所帮助。您还可以在单​​个元素上使用 OFFSETOF 宏和 sizeof() 来详细探索差异。

于 2009-11-09T09:06:05.007 回答
1

#pragma pack可能会在构建一个或另一个库时使用,该库可能会改变结构的大小,而与编译器命令行上的任何内容无关。

可能导致大小差异的另一件事是,结构声明中使用的任何 typedef 是否可能使用条件编译定义为一种或另一种类型。

于 2009-11-09T09:06:14.087 回答