16

レジスタ変数の格納に関する点について、いくつか明確にしたいと思います。コードでレジスタ変数を宣言した場合、それがレジスタにのみ格納されることを保証する方法はありますか?

#include<iostream>

using namespace std;

int main()
{
    register int i = 10;// how can we ensure this will store in register only.
    i++;
    cout << i << endl;
    return 0;
}
4

8 に答える 8

6

このregisterキーワードは、C と C++ では意味が異なります。C++ では、実際には冗長であり、最近では推奨されていないようです。

Cでは違います。まず、キーワードの名前をそのまま使用しないでください。最新の CPU の「ハードウェア レジスタ」と常に関係があるとは限りません。変数に課せられた制限は、register変数のアドレスを取得できないことであり、&操作は許可されていません。これにより、最適化のために変数をマークし、そのアドレスを取得しようとした場合にコンパイラーが叫ぶようにすることができます。特に、修飾registerされている変数はconst決してエイリアスできないため、最適化の良い候補です。

as in C を体系的に使用registerすると、変数のアドレスを取得するすべての場所を考える必要があります。オブジェクトへの参照などに大きく依存している C++ では、これはおそらくやりたいことではありません。registerこれが、C++ が変数のこのプロパティを C からコピーしなかった理由かもしれません。

于 2013-04-09T21:22:22.240 に答える
2

レジスタを確実に使用する唯一の方法は、インライン アセンブリを使用することです。ただし、これを行ったとしても、コンパイラがインライン アセンブリ ブロックのに値を格納しないという保証はありません。そしてもちろん、OS は、CPU を別のプロセスに渡すために、すべてのレジスタをメモリに保存して、任意の時点でプログラムを中断することを決定する場合があります。

したがって、すべての割り込みを無効にしてカーネル内にアセンブラ コードを記述しない限り、変数がメモリにヒットしないことを保証する方法はまったくありません。

もちろん、これは安全性を重視する場合にのみ関係します。パフォーマンスの観点からは、通常は でコンパイルする-O3だけで十分です。コンパイラは通常、どの変数をレジスタに保持するかを決定する際に非常にうまく機能します。いずれにせよ、変数をレジスタに格納することは、パフォーマンス チューニングの小さな側面の 1 つにすぎません。より重要な側面は、内側のループで余分な作業やコストのかかる作業が行われないようにすることです。

于 2014-02-12T21:40:18.293 に答える
2

"register" キーワードは、コンパイラが 2MB の RAM (ユーザーがログインしている 18 の端末間で共有される) を備えたマシンに適合しなければならなかった時代の名残りです。または、128 ~ 256 KB の RAM を搭載した PC/ホーム コンピューター。その時点で、コンパイラーは、レジスターを最も効果的に使用するために、どのレジスターをどの変数に使用するかを判断するために、大きな関数を実際に実行することができませんでした。したがって、プログラマーが で「ヒント」を与えた場合register、コンパイラーはそれを (可能であれば) レジスターに入れます。

最近のコンパイラは 2MB の RAM に何度も収まることはありませんが、変数をレジスタに割り当てることに関してははるかに巧妙です。与えられた例では、コンパイラーがそれをレジスターに入れない可能性は非常に低いと思います。明らかに、レジスターの数には制限があり、十分に複雑なコードが与えられた場合、一部の変数はレジスターに収まりません。しかし、このような単純な例の場合、最新のコンパイラはiレジスタを作成し、おそらく内部のどこかまでメモリに触れませんostream& ostream::operator<<(ostream& os, int x)

于 2013-04-09T18:20:26.247 に答える
0

ここではvolatile register int i = 10、C++ で使用して、確実iにレジスターに格納することができます。volatileキーワードは、コンパイラが変数を最適化することを許可しませんi

于 2014-04-06T16:22:38.993 に答える