【问题标题】:MSVC: what compiler switches affect the size of structs?MSVC:哪些编译器开关会影响结构的大小?
【发布时间】: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


【解决方案1】:

好的,所以这可能是有史以来最晦涩的事情。
事实证明,matlab 将 /D_SECURE_SCL=0 添加到编译中,这会禁用名为 'secure iterators'
这反过来又导致std::vector的大小相差16个字节

【讨论】:

  • 我认为可能是这样的,但我发现 _HAS_ITERATOR_DEBUGGING 对于发布版本始终为 0。看起来_SECURE_SCL 启用的“已检查迭代器”内容也可以用于发布版本。
【解决方案2】:
  • 检查包含路径和库路径中的差异
  • 检查定义的预处理器符号中的差异
  • 检查项目设置中的任何差异(代码生成、链接等)
  • 是否在同一台机器上使用相同的 IDE 编译两个版本?

【讨论】:

    【解决方案3】:

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

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

    我想不出其他任何事情(几乎不可能)。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多