C++で、Standard Template Libraryを用いた場合、STLを使わない場合に比べ、2倍以上遅くなります。同じコードをintel c++でコンパイルすると、STL利用によるオーバヘッドは16%程度です。またg++では、STLを使っても速度低下はありません。オブジェクトの可変長配列などを使う場合、どうしてもSTLが必要です。(他に方法があればお教え下さい。教科書類にはたいていSTLを使えとあります。)STL利用(とりわけvector)によるオーバヘッドを小さくする方法はないでしょうか?

時間がかかっている原因は、vector での要素のアクセスにおいて、アクセス毎に、添字の範囲チェックが行われているためです。 対策は、以下のとおりです。

  • 対策1. 添字の範囲チェックなしでアクセスするようにプログラムを書き換える。vector には、要素へのアクセス方法として operator[]()at() の二つが用意されています。
    • operator[]() は、範囲チェックなしでアクセスします。
    • at() は、範囲チェックありでアクセスします。範囲外の添字が使われた場合、out_of_range を投げます。
      範囲チェックありの at() を使った方が安全ですが、すでに範囲チェックが済んでいる場合、operator[]() を使う方が高速に実行できます。
      例. a.at(n+1) というアクセスを、a[n+1] に変える。
  • 対策2. vector ではなくて、valarray を使うようにプログラムを書き換える。プログラムの要件に沿っているかどうか分かりませんが。両者の違いは、vector の方が、汎用性があるということでしょうか。
    • vector は、さまざまな型のオブジェクトを保持・管理できるように設計された柔軟なコンテナ。
    • valarray は、数値計算のために設計されたベクタ。