如何获取变量的属性?
例:
int a = 5;
....
....
isConstant(a); //Prints "no!" if 'a' is not a constant at this time.
isRegister(a); //Prints "yes!" if 'a' is a register at this time.important.
isVolatile(a); //Prints "trusted" if 'a' is volatile.
isLocal(a); //If it is temporary.
isStatic(a); //Static?
我只读过关于改变一个变量的常数的知识,而没有读过其他的。
最佳答案
主要是因为我想知道是否可以:通过一点点内联汇编,您可以查看某些内容是否在寄存器中。它要求两次相同的输入,一次在一个寄存器中,一次在任何地方,即存储器或寄存器。如果更改一个都更改,那么您将获得与两个输入相同的寄存器。
以下在使用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扩展名,这又使该命令不可移植,这是一个脆弱的技巧。您需要小心-积极的优化可能会破坏这一点。这是一个很好的暗示,您应该将此问题留给编译器,而不用担心寄存器中是否包含内容,并且使用该代码可能会改变答案,因为它可能会占用寄存器本身,并且存在非零风险!
关于c++ - 如何获取C/C++变量的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11467772/