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

Address of volatile data member in C++

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

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

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

谢谢 :)

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

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

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