C ++中volatile数据成员的地址

时间:2015-12-18 09:48:13

标签: c++ volatile

int main()
{
volatile int a=26;
volatile int *p=&a;
cout<<p;  

return 0;
}
  1. Borland编译器输出为26,gcc O / P为1.为什么?

  2. 如果许多变量或大对象被声明为寄存器会发生什么情况,编译器会自动禁止它加载到寄存器上,而是将它们加载到内存中,或者挂起,显示错误等等。 >

  3. 谢谢:)

1 个答案:

答案 0 :(得分:2)

  1. operator<<(volatile int*)中的std::ostream没有重载,因此会考虑隐式类型转换。 volatile指针不能隐式转换为非volatile,因此std::ostream::operator<<(void*) - 通常在指针的情况下使用 - 不是一个选项。但是,类型的重载甚至可以将易失性指针转换为:operator<<(bool)。由于指针不为空,因此它的转换值为truecout输出为1。如果您要打印地址,请const_cast volatile限定符,以便隐式转换为void*。如果要打印指向的值,则通过解除引用来传递指向的值而不是指针。

    Borland似乎提供了取消引用指针的非标准重载。

  2. 无法在C ++中将变量声明为寄存器。是的,有一个register关键字,但它不会改变程序的含义而已被弃用(计划在c ++ 17版本的标准中删除)。完全由编译器决定变量是存储在存储器中还是仅存储在寄存器中。