ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

C++での高速化の話 ①forやwhileなどループ文

今週、どうやったらC++で高速化を図れるんだろう?と色々調べていて、
とても興味深い内容を見つけたので何回かに分けてご紹介したいと思います。


①forやwhileなどループ文
タイトルにも有るとおり、forやwhileなどループ文での高速化の実装方法です。
よく自分はvectorのsizeやend関数を条件式として利用してfor文やwhile文を回す時、

std::vector<int> v = {0,1,2,3,4,5,6,7,8,9};
for(int i =0; i < v.size(); ++i)
{
    //処理内容
}
std::vector<int> v = {0,1,2,3,4,5,6,7,8,9};
std::vector<int>::iterator i = v.begin();
while(i != v.end())
{
    //処理内容
}


みたいな感じで書いています。
が、条件式に入っているsize()やend()はループが回るたびに呼び出されてしまって、
その分無駄なコストがかかってしまいます。
素数が固定しているなら初期化の所で一緒に初期化してあげると
一回の呼び出しで済むことになって何回も呼び出すという無駄がなくなります。

std::vector<int> v = {0,1,2,3,4,5,6,7,8,9};
for(int i =0, size = v.size(); i < size; ++i)
{
    //処理内容
}
std::vector<int> v = {0,1,2,3,4,5,6,7,8,9};
std::vector<int>::iterator i = v.begin();
std::vector<int>::iterator end = v.end();
while(i != end)
{
    //処理内容
}

C++11から範囲ベースforが使えるのでそちらでやる場合は役に立ちませんが、
イテレータを使いたい場合は今回のやり方を使えるのでぜひ活用してみてください。