C++ mutable、volatileの使い方・速度 【チュートリアル】


mutable

mutableは、クラスのconstメンバ関数(メソッド)の中でも操作できるメンバ変数を作る場合に指定する。

スポンサーリンク
具体的にどういう場合にこれを使うかについてだが、例えばこのようにgetFugaの呼ばれた回数をひそかに保持しておくとか、

ある更新があった場合だけ文字列を更新してあげるなどが考えられる。

そもそもmutableという英語の意味は、goo辞書を参照して

変りやすい, 移り気の

という意味のようだ。そもそも値を少しでも更新するならconstなど使うなという話でもあるが、パフォーマンスは向上させたいが、意味的にはconstなどという場合はやはりあるようでそんな場合には使えるのではないかと。

volatile

volatileを変数に付け加えることで、コンパイラの最適化を無効にしレジスタではなく常にメモリにアクセスして変数を利用する。マルチスレッドなどでは、変数がどこでいつ変更されるかわからないので、このような指定が必要だとのこと。

ただ、CriticalSectionを利用してスレッドセーフにしておけばおそらくこのようなことは必要ないので、ここら辺はパフォーマンスの向上のため利用することとなるだろう。ということで次のようなコードで実験してみた。あるグローバル変数に対してvolatileありとなしの変数を1024 * 1024 * 1024回、回してそれを代入するというものである。

結果は、(いつものようにQueryPerformanceCounterで測定して)前のループが0.469265秒に対し後ろのループは3.632109秒だった(マシンはIntel Core 2 Duo E6600)。ここでmの参照回数が何回かあるのだが、速度的には7〜8倍になってしまっている。逆アセンブリするとコードも変わっており、前のループが下のようになるのに対し、

後ろのループでは、

となっていた。たしかに毎度読み込んでいることがわかる。(ちなみに、Release最適化ビルド)

こちらのvolatileという英語の意味は、goo辞書を参照して

揮発性の; 移り気の

という意味らしい。揮発性というのはよく聞くが、移り気のとう意味はmutableとかぶっている。

スポンサーリンク
カテゴリー: チュートリアル   パーマリンク

コメントは受け付けていません。