MSVC:哪些编译器开关会影响结构的大小?

问题描述 投票:0回答:5

我有两个单独编译的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。

c++ struct alignment visual-c++ sizeof
5个回答
5
投票

好吧,这可能是有史以来最晦涩难懂的事情了。
事实证明,matlab 将

/D_SECURE_SCL=0
添加到编译中,这会禁用称为 '安全迭代器'
的东西 这又导致
std::vector

的大小相差 16 个字节

2
投票
  • 检查包含路径和库路径是否存在差异
  • 检查定义的预处理器符号中的差异
  • 检查项目设置中的任何差异(代码生成、链接等)
  • 是否在同一台机器上使用相同的 IDE 编译两个版本?

1
投票

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

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

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

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


1
投票
当构建一个或另一个库时,可能会使用

#pragma pack
,这可能会独立于编译器命令行上的任何内容来更改结构的大小。

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


0
投票

在我的例子中,

_HAS_EXCEPTIONS=0
导致
sizeof(std::exception)
从24字节减少到16字节。

© www.soinside.com 2019 - 2024. All rights reserved.