我正在使用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自動化類型)。 –