読者です 読者をやめる 読者になる 読者になる

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!とか。