一般に、CPPコンパイラ(g ++)はコードに対してかなりの最適化を行います。したがって、レジスタ変数を宣言するとき、コンパイラがその値をレジスタに直接格納する必要はありません。 (つまり)コード 'register int x'はコンパイラがそのintをレジスタに直接格納することにはなりません。しかし、コンパイラに強制することができれば、成功する可能性があります。
たとえば、次のコードを使用すると、コンパイラは自分の望むことを強制することがあります。次のコードのコンパイルでエラーが発生する可能性があります。これは、intが実際にレジスタに直接格納されていることを示します。
int main() {
volatile register int x asm ("eax");
int y = *(&x);
return 0;
}
私の場合、g ++コンパイラはこの場合、次のエラーを投げています。
[[email protected] cpp]$ g++ register_vars.cpp
register_vars.cpp: In function ‘int main()’:
register_vars.cpp:3: error: address of explicit register variable ‘x’ requested
ライン「揮発性レジスタint型のx ASM( 『EAX』)は、」「EAX」に整数xを格納し、コンパイラに指示されて登録し、そうすることで任意の最適化を行いません。これは、値がレジスタに直接格納されることを確認します。そのため、変数のアドレスにアクセスするとエラーが発生します。
また、Cコンパイラ(gcc)は、次のコード自体でエラーになることがあります。
int main() {
register int a=10;
int c = *(&a);
return 0;
}
私の場合、gccコンパイラはこの場合、次のエラーを投げています。
[[email protected] cpp]$ gcc register.c
register.c: In function ‘main’:
register.c:5: error: address of register variable ‘a’ requested
CとC++は、プログラムが実行されているハードウェアに「レジスタ」があることを保証しません。それは単にコンパイラへのヒントです。 –
なぜ気になりますか? – delnan
@StephenCanon C言語のヒントではなく、変数 'register'を宣言することで、そこでのアドレス指定を禁止します。 (実際にレジスタに変数を配置することについてのヒントではないかもしれません) –