C++ 什么编译器开关会影响结构的大小?

C++ 什么编译器开关会影响结构的大小?,c++,struct,alignment,visual-c++,sizeof,C++,Struct,Alignment,Visual C++,Sizeof,我有两个单独编译的DLL,一个是从Visual Studio 2008编译的,另一个是从matlab编译的mex文件。 两个DLL都包含一个头文件。当我在一个DLL中获取结构时,它返回48,在另一个DLL中返回64。 我已经检查了/Zp开关,在这两种编译中它都设置为/Zp8 还有哪些编译器开关可能会影响结构的大小? 结构是一个简单的POCO,没有继承和虚拟函数 编辑 结构如下所示: class LIBSPEC SGeometry { public: std::vector<IG

我有两个单独编译的DLL,一个是从Visual Studio 2008编译的,另一个是从matlab编译的mex文件。
两个DLL都包含一个头文件。当我在一个DLL中获取结构时,它返回48,在另一个DLL中返回64。 我已经检查了
/Zp
开关,在这两种编译中它都设置为
/Zp8

还有哪些编译器开关可能会影响结构的大小?
结构是一个简单的POCO,没有继承和虚拟函数


编辑

结构如下所示:

class LIBSPEC SGeometry
{
public:

    std::vector<IGeometry> m_i;
    uint N;
    uint n_im, n_s;
};
class LIBSPEC SGeometry
{
公众:
std::向量m_i;
uint N;
是的,不是的;
};
在debug中,它
sizeof()
在这两种情况下都返回56,在发行版中,在mex编译中,它是48,从VS返回64。
我可以告诉matlab编译mex时要使用的确切编译器选项,所以不是它


编辑

在使用offsetof进行检查后,发现差异在于
std::vector
的大小。在一个dll中是32,在另一个dll中是48。
两个DLL都是x64。

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

类型定义可能受包含的不同文件的影响

我想不出其他任何事情(完全不可能)

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

#pragma pack
可以在构建一个或另一个库时使用,该库可能会独立于编译器命令行上的任何内容更改结构的大小

造成大小差异的另一个原因是,在结构声明中使用的任何typedef是否可以使用条件编译定义为一种类型或另一种类型。

  • 检查包含路径和库路径之间的差异
  • 检查定义的预处理器符号是否存在差异
  • 检查项目设置中的任何差异(代码生成、链接等)
  • 是否在同一台机器上使用相同的IDE编译两个版本
      好吧,这可能是有史以来最模糊的事情了。
      事实证明,matlab向编译中添加了
      /D\u SECURE\u SCL=0
      ,从而禁用了名为

      这反过来又会导致std::vector的大小相差16个字节

      您确定在构建一个或另一个库时没有改变打包的杂注吗?此外,显示结构的代码-这可能会提供线索。matlab文档是否建议使用什么结构对齐方式?也许你必须使用适当的语法来调整C++的对齐方式。在MSVC 2008中,向量是3个指针和分配器——我会看分配器中可能有什么不同。我认为它可能是类似的,但是我发现<代码>·HasyTyrAtter调试对于释放构建来说,总是为0。看起来由
      \u SECURE\u SCL
      启用的“检查迭代器”功能也可以用于发布版本。