vc 2012のc++0 x特性対std::moveのサポートテスト


最近私のオープンソースライブラリst_asio_wrapper(boost.asioに基づくc/sフレームワーク)は詳細なチェックを行い、主にメモリコピー防止で私の予想に達したかどうかを見て、vc 2012の結果は満足していないようです(gcc 4.7に対して)、私のどこの書き方が間違っていますか?
注:測定は全面的ではなく、主にstd::string boost::container::list boost::bindなどのst_asio_wrapperが使っているもの.
テストコード1:
void fun(std::string& str)
{
	printf("%p
", str.data()); } int main() { const char* pstr = "123456789012345678901234567890123456789"; std::string s(pstr); container::list<std::string> l; printf("%p
", s.data()); l.push_back(std::move(s)); printf("%p %p
", s.data(), l.front().data()); boost::bind(&fun, std::move(l.front()))(); printf("%p
", l.front().data()); return 0; }

出力:
1.gccでコンパイルする:
0 xac 60 e 8//元のstd::stringアドレス
0x7f77d15234d8
0 xac 60 e 8//moveに成功し、listヘッダ要素アドレスが元のstd::stringアドレスになりました.
0 xac 60 e 8//move成功、boost::bindパラメータアドレスがlistヘッダアドレスになりました
0 x 7 f 77 d 15234 d 8//move成功を再証明
2.vcでコンパイル:
00000000001 E 8 F 00//元std::stringアドレス
00000000002EE890
000000000001 E 8 F 00//move成功、listヘッダアドレスが元のstd::stringアドレスになりました
00000000001 EC 540//moveが成功したかどうかはわかりませんが、データは少なくとも1回コピーされています(アドレスは
00000000001 E 8 F 00になりました)
0000000001 EC 4 D 8//ここではmoveが成功していることがわかります(アドレスはもうありません
00000000001 E 8 F 00ですが、0000000001 EC 540でもないので、前にコピーしたことを証明します)
結論:vc 2012でboost::bindを使用すると、moveのサポートがあまりよくありません.
テストコード2:
//          move         ,         move     (  move    )
struct MESSAGE
{
	int id;
	std::string str;
};

void fun(MESSAGE& msg)
{
	printf("%p
", msg.str.data()); } int main() { const char* pstr = "123456789012345678901234567890123456789"; MESSAGE msg = {0, pstr}; container::list<MESSAGE> l; printf("%p
", msg.str.data()); l.push_back(std::move(msg)); printf("%p %p
", msg.str.data(), l.front().str.data()); boost::bind(&fun, std::move(l.front()))(); printf("%p
", l.front().str.data()); return 0; }

出力:
1.gccでコンパイルする:
0x18740e8
0x7f304898b4d8
0x18740e8
0x18740e8
0x7f304898b4d8
テストコード1の出力と比較すると、アドレスが異なる以外はアドレス変換が全く同じであり、構造体MESSAGEはmove関連のものを実装していないが、その内部は単純なデータ型とmoveをサポートするデータ型であるため、move操作もサポートされていることを示している.
2.vcでコンパイル:
00000000002CD910
00000000002CD910 00000000002CD9B0
00000000002CDAF0
00000000002CD9B0
残念ながら、moveが成功したのは1回もなく、少なくとも4回コピーしました!
結局、vc 2012はmoveのサポートが悪く、私のコードに問題があるかどうか分かりません.