C++中volatile数据成员的地址
Address of volatile data member in C++
int main()
{
volatile int a=26;
volatile int *p=&a;
cout<<p;
return 0;
}
Borland编译器输出26,gcc O/P输出1,为什么?
如果许多变量或大对象被声明为寄存器会发生什么情况,编译器会自动禁止它加载到寄存器上,而是加载到内存上,或者挂起,显示错误等。 ?
谢谢 :)
std::ostream
中operator<<(volatile int*)
没有重载,所以考虑隐式类型转换。 volatile
指针不能隐式转换为非 volatile
,因此 std::ostream::operator<<(void*)
- 通常在指针的情况下使用 - 不是一个选项。但是,有一个类型的重载,即使是易失性指针也可以转换为:operator<<(bool)
。由于指针不为空,因此它的转换值为 true
,cout
输出为 1
。如果要打印地址,则 const_cast
去掉 volatile
限定符,以便使用到 void*
的隐式转换。如果要打印指向的值,则通过取消引用传递指向的值而不是指针。
Borland 似乎提供了一个取消引用指针的非标准重载。
在 C++ 中无法将变量声明为寄存器。是的,有一个 register
关键字,但它并没有改变程序的含义并且已经被弃用(并且计划在 c++17 版本的标准中被移除)。完全由编译器决定变量是存储在内存中还是仅存储在寄存器中。
int main()
{
volatile int a=26;
volatile int *p=&a;
cout<<p;
return 0;
}
Borland编译器输出26,gcc O/P输出1,为什么?
如果许多变量或大对象被声明为寄存器会发生什么情况,编译器会自动禁止它加载到寄存器上,而是加载到内存上,或者挂起,显示错误等。 ?
谢谢 :)
std::ostream
中operator<<(volatile int*)
没有重载,所以考虑隐式类型转换。volatile
指针不能隐式转换为非volatile
,因此std::ostream::operator<<(void*)
- 通常在指针的情况下使用 - 不是一个选项。但是,有一个类型的重载,即使是易失性指针也可以转换为:operator<<(bool)
。由于指针不为空,因此它的转换值为true
,cout
输出为1
。如果要打印地址,则const_cast
去掉volatile
限定符,以便使用到void*
的隐式转换。如果要打印指向的值,则通过取消引用传递指向的值而不是指针。Borland 似乎提供了一个取消引用指针的非标准重载。
在 C++ 中无法将变量声明为寄存器。是的,有一个
register
关键字,但它并没有改变程序的含义并且已经被弃用(并且计划在 c++17 版本的标准中被移除)。完全由编译器决定变量是存储在内存中还是仅存储在寄存器中。