我正在使用VS2010和VS2012的项目解决方案。Visual Studio 2010和2012中STL容器的字节大小差异
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的第一元素似乎读得很好,只有在矢量随后元素似乎得到炒。 (见图片。)在 “main.cpp中” 调试 “撷取的” 变量
图片在2010年和2012年编制
有人要我澄清变量被分享的方式。
我们正在编译第一个项目到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教程
你知道为什么会发生? – elyashiv
似乎合理的是,更新版本的STL将以不同的方式/更高效地实现各种功能。如果您将VS2012指向VS2010的include/lib文件夹,会发生什么? – DCoder
通过“共享两个项目之间的变量”,你会发现什么?这是二进制序列化?使用文字。它是共享内存吗?别。它是DLL吗?使用标准的DLL类型(OLE自动化类型)。 –