如何获取变量的属性?

例:

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/

10-13 08:31