Chiharu の日記

絵描き C/C++ プログラマーの日記です。

C++0x の nullptr 〜GCC であれれ?

先日の日記の続き。
さらに先日の日記のコードを Cygwin 環境で、

$ gcc test_memcpy.cpp -msse2 -std=c++0x -lstdc++ -O3

こんな感じでコンパイルしたら、

test_memcpy.cpp: In function ‘void xmmcpy_da_sa(void*, const void*, size_t)’:
test_memcpy.cpp:16:2: error: ‘nullptr’ was not declared in this scope
test_memcpy.cpp: In function ‘void xmmcpy_da_s(void*, const void*, size_t)’:
test_memcpy.cpp:45:2: error: ‘nullptr’ was not declared in this scope
test_memcpy.cpp: In function ‘void xmmcpy_d_sa(void*, const void*, size_t)’:
test_memcpy.cpp:74:2: error: ‘nullptr’ was not declared in this scope
test_memcpy.cpp: In function ‘void xmmcpy_d_s(void*, const void*, size_t)’:
test_memcpy.cpp:103:2: error: ‘nullptr’ was not declared in this scope

なんてエラーが。GCC は 4.5 を使用しているのですが、nullptr って非サポートなんですね。仕方ないので、

$ gcc test_memcpy.cpp -msse2 -std=c++0x -lstdc++ -O3 -Dnullptr=0

コンパイル通しました。実行してみると、

$ ./a.exe
prepare   : 13.712
d/s align : 5.959
dst align : 6.505
src align : 7.645
not align : 8.002
normal cpy: 13.557

…あれれ?今度はストアをアライメントした方が速くなりました。不思議。まぁ、いずれにしても非アライメント版よりは速いので良いんですけれど。