ローカル変数(intなど)は、少なくともそのアドレスがどこにも必要でない限り、プロセッサレジスタに格納することができます。たとえば、複雑なハッシュを計算する関数を考えてみましょう。メンバー変数(属性)はC++のレジスタに存在できますか?
ここで、バッファはメモリに収まらないとします。我々はfoo
複数回呼び出し、データのチャンクからハッシュを計算するためのクラスを記述:
struct A
{
void foo(int const* buffer, int size)
{
// perform heavy computations involving frequent reads and writes to a
}
int a;
};
A object;
while (...more data...)
{
A.foo(buffer, size);
}
// do something with object.a
例では、ビット不自然であってもよいです。ここでの重要な違いは、a
がフリー関数のローカル変数であり、オブジェクトのメンバー変数であるため、状態が複数の呼び出しで保持されることです。
今質問:foo
メソッドの冒頭にa
メソッドをレジスタにロードして最後に格納するのは合法でしょうか?実際には、これはオブジェクトを監視する第2のスレッドが中間値a
(同期と未定義の動作を脇に)を決して観察できないことを意味する。スピードがC++の主要な設計目標であるならば、これは合理的な動作であるようです。コンパイラーがこれをやるのを防ぐ標準が何かありますか?いいえの場合、コンパイラは実際にこれを行いますか?言い換えれば、メンバ変数を使用した場合、機能の始めと終わりに一度ロードして保存する以外に、(おそらく小さな)パフォーマンスペナルティを期待できますか?
私が知る限り、C++言語自体はレジスタが何であるかを指定していません。しかし、とにかく問題ははっきりしていると思います。これは重要なことですが、私は標準的なx86またはx64アーキテクチャの答えに感謝します。
"register"と "volatile"フラグを確認してください – amchacon
@amchacon実際、C++には現在 'register'キーワードがあります。しかし、私は、C++では非推奨であることをさらに指摘しています。 –