5

知りたいのですが、register指定子で定義された変数が CPU レジスタに格納されているかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

1

変数がレジスタに格納されている場合は、メモリに格納されていないことを意味します。そこで、ブルズアイは、printf を使用して変数のアドレスにアクセスしようとしています。出力が何らかのアドレスを与える場合、結論はメモリに格納されているため、自動ストレージ クラス変数として機能します (レジスタには格納されません)。しかし、「組み込み関数 'printf' の互換性のない暗黙の宣言」というエラーが発生した場合、これは、変数がレジスタに格納され、レジスタ ストレージ クラス変数として動作することを意味します。

于 2016-12-09T05:12:19.670 に答える
1

歴史的に、このregisterキーワードはコンパイラーへの最適化のヒントとして数十年前に導入されました。現在、プロセッサがより汎用的なレジスタを備えている場合、コンパイラは通常、そのように指示されていなくても変数をレジスタに配置します (コードが最適化されてコンパイルされている場合)。

単なるヒントであり強制ではないため、強制することはできません。ただし、コードのその部分はアセンブラーで記述できます。このようにして、変数の保存場所を完全に制御できます。

于 2016-04-29T11:54:04.893 に答える
0

おそらく、アセンブリ命令を呼び出すと役立つでしょう:

/// Function must be something like this:
int check_register_storing()
{
    __asm__ (
        pushad               // Save registers
        and     ebx, ebx    // Set Zero
        and     eax, eax 
        and     ecx, ecx
        and     edx, edx
);

// Set test number.
register int a = 8; // Initial value;
int from_register = 0;

asm(
    add  eax, ebx    // If, 'a' variable set on CPU register,
    add  eax, ecx    // Some of main usage registers must contain 8
    add  eax, edx    // Others must contain 0 
    mov  %from_register, eax
    popad            // Return default parameters to registers
}

/// Check result
printf( "Original saved number: %d, Returned number from main registers: %d\n", a, from_register );

}

于 2016-04-29T12:07:02.847 に答える