■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++ストリームとで切り離しておく
↓キャッシュメモリの有効利用