Intel C++ Compiler で C++ 標準ライブラリを使うときに気をつけたいこと

2ヶ月以上ぶりです.

最近 Intel C++ Compiler (icpc) を使う機会が増えたのですが, GCC で書いたプログラムを他のコンピュータ (自分でシステム管理ができないタイプ) でコンパイル/実行しようとしたときに躓いたのでメモ.

Intel C++ Compiler Linux 版は GCC とのバイナリ互換性を持ってます. それは GCC をバックエンドコンパイラとして使用する必要があるからか, 使用しているからなのかは僕は詳しく知りませんが...

なので, STL などの標準ライブラリは GCC のヘッダをそのまま使っているようです. そのため, 今使っている GCC が古いと問題にある場合があります. 例えば move semantics とかですね. rvalue reference があっても STL などのコンテナが対応していないのでは問題になります.

僕が特に躓いたのは関数の std::begin/std::end が になかったことです. なんかおかしいなと思って -H オプションでどのヘッダを読み込んでいるのか確認しました.

GCC は 4.4.5 で Intel C++ Compiler は 13.1 です.

#include <vector>

int main(int argc, char** argv) {}
$ icpc -H main.cpp
. /usr/include/c++/4.4.5/vector
.. /usr/include/c++/4.4.5/bits/stl_algobase.h
... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/c++config.h
.... /usr/include/bits/wordsize.h
.... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/os_defines.h
..... /usr/include/features.h
...... /usr/include/sys/cdefs.h
....... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs.h
....... /usr/include/bits/wordsize.h
....... /usr/include/gnu/stubs-64.h
.... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/cpu_defines.h
... /usr/include/c++/4.4.5/cstddef
.... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h
..... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h
... /usr/include/c++/4.4.5/bits/functexcept.h
.... /usr/include/c++/4.4.5/exception_defines.h
... /usr/include/c++/4.4.5/bits/cpp_type_traits.h
... /usr/include/c++/4.4.5/ext/type_traits.h
... /usr/include/c++/4.4.5/ext/numeric_traits.h
... /usr/include/c++/4.4.5/bits/stl_pair.h
.... /usr/include/c++/4.4.5/bits/move.h
..... /usr/include/c++/4.4.5/cstddef
...... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h
....... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h
..... /usr/include/c++/4.4.5/bits/concept_check.h
... /usr/include/c++/4.4.5/bits/stl_iterator_base_types.h
.... /usr/include/c++/4.4.5/cstddef
..... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h
...... /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h
... /usr/include/c++/4.4.5/bits/stl_iterator_base_funcs.h
... /usr/include/c++/4.4.5/bits/stl_iterator.h
... /usr/include/c++/4.4.5/debug/debug.h
.. /usr/include/c++/4.4.5/bits/allocator.h
... /usr/include/c++/4.4.5/x86_64-redhat-linux/bits/c++allocator.h
.... /usr/include/c++/4.4.5/ext/new_allocator.h
..... /usr/include/c++/4.4.5/new
...... /usr/include/c++/4.4.5/cstddef
....... /opt/intel/Compiler/Intel/composer_xe_2013.1.117/compiler/include/stddef.h
........ /usr/lib/gcc/x86_64-redhat-linux/4.4.5/include/stddef.h
...... /usr/include/c++/4.4.5/exception
.. /usr/include/c++/4.4.5/bits/stl_construct.h
.. /usr/include/c++/4.4.5/bits/stl_uninitialized.h
.. /usr/include/c++/4.4.5/bits/stl_vector.h
... /usr/include/c++/4.4.5/initializer_list
.. /usr/include/c++/4.4.5/bits/stl_bvector.h
.. /usr/include/c++/4.4.5/bits/vector.tcc

こんな感じで STLGCC のものを直接使ってるようです.

ちょっとこれだと困ったので, 管理者にせめて 4.6.3 辺りにバージョンアップしてくれないか相談してみます.