0

register キーワードを持つ変数が参照によって関数に渡されるコードを見てきました。

バージョン 1:

inline static void swap(register int &a, register int &b) 
{
    register int t = a; 
    a = b; 
    b = t; 
}

バージョン 2:

inline static void swap(register int a, register int b) 
{
    register int t = a; 
    a = b; 
    b = t; 
}

2 つのバージョンの違いは何ですか?

私の理解では、abはレジスタに保持されるため、これらのレジスタの値に加えられた変更は、参照演算子を使用せずに呼び出し元と呼び出し先の境界を越えて保持されるため、参照演算子は何の影響も与えません。

4

2 に答える 2

4

C プログラムでは、レジスタ変数のアドレスを取得できません。

register int x;
int * p = &x; // Compiler error

これは、クライアントが値としてのみ使用されるべきもののアドレスを取得するのを防ぐために、マクロで役立つ場合があります。

registerの使用は、C++11 標準では推奨されていません ([depr.register] を参照)。C++ では、レジスタ変数のアドレスを取得することは合法ですが、C++11 標準の最新リビジョンでは、レジスタ変数のアラインメントを alignas で宣言することは合法ではありません。7.6.2 アラインメント指定子を参照

alignas() の使用を妨げ、local の外で使用すると構文エラーが発生する以外、registerは C++ では何もしません。これは非推奨であり、マクロ内で使用される変数のアラインメントを防止したい理由が想像できないため、C++ コードで register を使用することは避ける必要があります。

質問に答えるには: C++ では、コードとレジスタを削除した同等のコードとの間に違いはないため、「2 つのバージョン」は明らかに異なります。

于 2014-07-12T03:14:54.433 に答える
-1

C++ プログラムの場合、コンピュータのメモリは一連のメモリ セルのようなもので、それぞれのサイズが 1 バイトで、それぞれに一意のアドレスがあります。これらのシングル バイト メモリ セルは、1 バイトを超えるデータ表現が連続したアドレスを持つメモリ セルを占有できるように並べられています。

このようにして、各セルはその一意のアドレスによってメモリ内で簡単に見つけることができます。たとえば、アドレス 1776 のメモリ セルは、常にアドレス 1775 のセルの直後に続き、1777 のセルの前にあり、776 の後にちょうど 1,000 セル、2776 の前にちょうど 1,000 セルです。

変数が宣言されると、その値を格納するために必要なメモリに、メモリ内の特定の場所 (メモリ アドレス) が割り当てられます。一般に、C++ プログラムは、変数が格納される正確なメモリ アドレスを積極的に決定しません。幸いなことに、そのタスクは、プログラムが実行される環境 (通常、実行時に特定のメモリ位置を決定するオペレーティング システム) に任されています。ただし、プログラムが実行時に変数のアドレスを取得できると、変数に関連する特定の位置にあるデータセルにアクセスできると便利な場合があります。

于 2014-07-12T03:20:17.583 に答える