ほとんどの場合、できるかどうかを知りたかったからです。少しインラインアセンブリを使用して、何かがレジスタにあるかどうかを確認できます。同じ入力を 2 回要求します。1 回はレジスターで、もう 1 回はメモリーまたはレジスターのいずれかです。1 つを変更すると両方が変更される場合、両方の入力と同じレジスタが与えられています。
以下は、gcc を使用して x86 および x86_64 で機能しました。
#include <iostream>
#define isRegister(x) \
{ \
bool result; \
asm("notl %1; /* alter always register one */ \
cmpl %2, %1; /* has the other changed? */ \
sete %0; /* save to result */ \
notl %1; /* restore */" \
:"=&q"(result) /* out */ \
:"r"(x), "g"(x) /* in */ \
: /* no clobber */ \
); \
std::cout << (result ? "Yes" : "No") << "\n"; \
}
int main() {
register int a=666;
int b=667;
register int c = 0;
int d = 0;
isRegister(a);
isRegister(b);
isRegister(c);
isRegister(d);
std::cout << a << ", " << b << ", " << c << ", " << d << "\n";
}
ここでインライン asm を使用すると、すぐに移植性がなくなります。実際のコードで gcc の expr-statement 拡張を使用すると、これも移植性がなくなり、脆弱なハックになります。注意が必要です - 積極的な最適化はこれを壊す可能性があります。これは、レジスターに何があるかどうかを心配するのではなく、これをコンパイラーに任せるべきであるという非常に良いヒントです。実際にこのコードを使用すると、レジスター自体を占有する可能性があるため、答えが変わる可能性があるゼロではないリスクがあります!