c++ - Visual Studio 2010 和 2012 中 STL 容器字节大小的差异

标签 c++ visual-studio dll stl visual-studio-2012

我正在处理 VS2010 和 VS2012 项目的解决方案。

VS2010 项目调用 VS2012 中的函数,反之亦然。起初这很好用,但是当我还需要在两个项目之间共享变量时,我注意到变量似乎没有相同的内存对齐方式,并且每个项目对相同内存地址的解释不同。

更新: 它似乎只在使用 STL 容器 时发生,其他不包含 std::的结构和类工作正常。

为了说明问题,以下代码在不同的 Visual Studio 版本上运行时应该产生不同的结果。

#include <string>
#include <vector>

int main()
{
    int stringSize = sizeof(std::string);           // Yelds 32 on VS2010, 28 on VS2012
    int intVectorSize = sizeof(std::vector<int>);   // Yelds 20 on VS2010, 16 on VS2012

    return 0;
};

将两个项目更新到同一版本对我来说不可能,因为我有一些与每个版本相关的依赖项。

有人知道解决方案或绕过问题的方法吗?

我会尽快将这两个项目升级到 VS2012 编译器,但现在我正在寻找一个快速而肮脏的解决方案,这样我就可以继续工作了。由于它似乎只出现在 STL 容器中,是否可以在所有项目中使用旧版本的库?还是有可能愚弄编译器?也许改变填充大小?

此外,std::vector 中的第一个 元素似乎没有问题,只有 vector 中的后续 元素似乎被打乱 . (见图片。)

Debug Image

调试 2010 年和 2012 年编译的“main.cpp”中的“Fetched”变量的图像。


有人要我澄清共享变量的方式。

我们正在 VS2012 编译模式下将第一个项目编译成 DLL,然后尝试在 VS2010 中访问该项目。

这里有一些代码可以重现问题。如果您想自己尝试,可以下载完整的 VS2012 解决方案 here .

此代码使用VS2012编译成DLL。

DllExport.h

#ifdef DLLHELL_EX
#define DLL_API __declspec(dllexport) 
#else
#define DLL_API __declspec(dllimport) 
#endif

#include <vector>
#include <string>

class DLL_API Foo
{
public:
    Foo();
    ~Foo();

    std::vector<std::string>* exposedMember;
};

DllExport.cpp

#include "DllExport.h"

Foo::Foo()
{
    // Create member
    exposedMember = new std::vector<std::string>();

    // Fill member with juicy data
    for(int i=0; i<5; i++)
            exposedMember->push_back("Fishstick");
}

Foo::~Foo()
{
    // Clean up behind ourselves like good lil' programmers
    delete exposedMember;
}

此代码使用DLL,使用VS2010编译。

main.cpp

#include "DllExport.h"

int main()
{
    // Creating class from DLL
    Foo bar;

    // Fetching "exposedMember" from class
    std::vector<std::string>* member = bar.exposedMember;

    return 0;
}

DLL 是使用 this 创建的教程

最佳答案

绝对不应该混合来自不同运行时版本的类型。即使它们的大小相同,它们也可能将变量存储在不同的位置,或者某些算法可能会略有不同。即使类型完全相同,不同的编译器也可能选择以不同方式表示它们。

确实没有什么好的方法可以做到这一点。 C++ 不保证其标准库的实现不会改变,并且编译器似乎无法就 ABI 达成一致(即使在同一编译器的不同版本之间),即使他们没有。在编写供他人使用的 API 时,大多数人选择仅导出完全在他们控制之下的 C 类型。

关于c++ - Visual Studio 2010 和 2012 中 STL 容器字节大小的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090341/

相关文章:

PHP 在 Windows 机器上安装 SSH2

c++ - 类内枚举的运算符

c++ - 初始化一个字符串数组作为参数

visual-studio - 如何仅为特定平台下载 nuget 包?

visual-studio - Visual Studio : custom project variables

c++ - 在函数定义中指定参数默认值导致错误 C2143 : syntax error : missing ')' before '='

c++ - 在同一进程中加载​​多个 dll 拷贝

c++ - 我可以在环中实现迭代器 end() 吗?

c++ - Xcode:从 Objective-C 项目引用 C++ 项目

c++ - 与其他库链接的静态库 - LINKER 警告