RAD Studio XEファーストインプレッション その2:C++ライブラリ編
C++RTLの更新
まず、ディスカッションフォーラムで問題になっていた、ストリームIOについての致命的なバグはFIXされました。こんなコードを喰わせると何故か文字化け。
#include <string> #include <iostream> #include <locale> int main() { char locale[] = "japanese"; std::locale::global(std::locale(locale)); std::wcin.imbue(std::locale(locale)); std::wcout.imbue(std::locale(locale)); std::wstring str; std::wcout << L"文字列を入力してください" << std::endl; std::wcin >> str; std::wcout << str << std::endl; return 0; }
あまりワイド文字のストリームは使わないけど、将来的にマルチバイトよりUnicodeが主流になるのは確実なので、似たような問題は出てくるはず。
あと、Boostは1.39.0のまま。ただ、String Algorithmが動くようになったのは、個人的に嬉しいニュース。
C++0x関連
RTLにおけるC++0xのムーブセマンティクス対応第一弾として、std::stringが対応。std::basic_stringにrvalue参照を引数にもつコンストラクタと代入演算子が追加されたので、戻り値がstd::stringやstd::wstringな関数のオーバーヘッドがほぼゼロに。下記のコードをC++Builder 2010とC++Builder XEのBCC32.exeでコンパイルして実行するとこんな感じ。
//--------------------------------------------------------------------------- #pragma hdrstop #include <windows.h> #include <vector> #include <string> #include <iostream> #include <tchar.h> #pragma argsused using namespace std; string make_buffer() { string buffer(1000000, 'a'); return buffer; } int _tmain(int argc, _TCHAR* argv[]) { DWORD t = 0; for (int j = 0; j < 10; ++j) { DWORD s = GetTickCount(); for(int i = 0; i < 10; ++i) { string v0; v0 = make_buffer(); } DWORD e = GetTickCount() - s; t += e; cout << "Process time:" << e << endl; } cout << "Average process time:" << t / 10 << endl; return 0; } //---------------------------------------------------------------------------
以下はベンチマーク。Windows7 x64/C2Q Q6700/Memory 8GBの環境でテスト。MoveTestCB2010.exeはC++Builder2010でこしらえたバイナリ。MoveTestCBXE.exeはC++Builder XEでこしらえたバイナリ。
G:\>MoveTestCB2010.exe Process time:6162 Process time:6162 Process time:6100 Process time:6162 Process time:6209 Process time:6099 Process time:6084 Process time:6146 Process time:6115 Process time:6084 Average process time:6132 G:\>MoveTestCBXE.exe Process time:16 Process time:15 Process time:0 Process time:16 Process time:0 Process time:16 Process time:0 Process time:0 Process time:16 Process time:0 Average process time:7
戻り値のやりとりがメモリイメージのコピーではなく、ポインタのやりとりになったので圧倒的にパフォーマンスアップ。正直、これは極端すぎる例だけど、ここまで速くなるとは、びっくりした。
(気力があればの)次回予告:
コードばっかりなせいか中身の割にちょっと長くなったので、新規追加されたVCLの正規表現クラスの使い方は次回で。あと、新たにバンドルされたネットワークコンポーネントのIP*Works!とか。