LoginSignup
8
5

More than 1 year has passed since last update.

C++ちょっと早くする方法まとめ

Posted at

■2倍は左シフト演算、割る2は右シフト演算を使う。

■gccコンパイラオプションで最適化オプション「-O3」を使う

■何度も呼び出される小さい関数については、ラムダ式を使うと早い場合がある。

■余計な一時オブジェクトを作らない
・const参照渡し or ポインタ渡しを活用する
・ムーブセマンティクス (C++11)
・noexcept

■コンテナ
・用途に合わせて使い分ける(std::array、std::vector、std::list、std::unordered_mapなど)
・メモリは一気に確保する。たとえば、std::vector の push_back()reserveなどを活用。

■ループ
・継続条件に注意。イテレータで回すときの v.end() も毎回呼び出されるので、
 for (size_t i=0; i < v.size(); ++i) よりも
 for (size_t i=0, n=v.size(); i<n; ++i) の方がよい。
 for (vector::iterator it=v.begin(), v_end=v.end(); it!=v_end; ++it) とか。
 C++11以降だとfor (const auto& x: v) という書き方で範囲ベースもできる。
・インクリメント、デクリメントは前置(++i)の方が早い。(一時オブジェクトが作られないため)
 ただし、コンパイラによって改善傾向にあり、現在はほぼ変わらないことが多い。
・出来る限り外で処理する。if-else や try-catch のブロックをループの外で大きく取れないか、 一時変数の定義や演算などをループの外で予めやっておけないか検討する。

↓フラグチェックを外に出すわかりやすい例文

【使用頻度低め】

コンパイル時定数 constexpr を活用する

インライン展開を活用し、関数の呼び出しコストを減らす。ただし、コンパイルに時間がかかりまくったり、実行ファイルサイズがでかくなったり、問題もある。

標準入出力をCストリーム(std::printf とか)とC++ストリームとで切り離しておく

↓キャッシュメモリの有効利用

8
5
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5