C++ 常数是如何表示的?
我想知道如果一个变量被声明为volatile常量,它可以使用I/o或任何外围设备进行更改吗? 例如: volatile const int输入=0;C++ 常数是如何表示的?,c++,c,visual-studio-2010,visual-c++,C++,C,Visual Studio 2010,Visual C++,我想知道如果一个变量被声明为volatile常量,它可以使用I/o或任何外围设备进行更改吗? 例如: volatile const int输入=0; 这样的变量也可以存储在内存中的什么位置?这完全取决于编译器,受相关标准引入的任何约束。假设您可以获取常数的地址并将其分配给指针,那么您可以推测该常数在该实例中占用内存 但这并没有真正暗示常量是如何存储在内存中的。如果这样做没有副作用,编译器可以完全优化它们。或者,const char*foobar=“foobar”和const char*bar=“
这样的变量也可以存储在内存中的什么位置?这完全取决于编译器,受相关标准引入的任何约束。假设您可以获取常数的地址并将其分配给指针,那么您可以推测该常数在该实例中占用内存
但这并没有真正暗示常量是如何存储在内存中的。如果这样做没有副作用,编译器可以完全优化它们。或者,
const char*foobar=“foobar”
和const char*bar=“bar”
甚至可能不会占据不相交的位置:试图修改其中一个(正式的未定义行为)将是灾难性的。使用volatile
确实会抑制某些优化,但具体行为仍取决于编译器。当变量定义为const
时,系统将其视为只读变量。不应修改其值的变量。但是,通过将变量定义为volatile
,程序员要求编译器避免编译器优化
让我们举一个例子:
volatile const int flag=0代码>
它说flag
是一个不应该修改其值的变量,并要求编译器避免编译器优化,这意味着编译器可以在其他系统进程的操作过程中更改flag的值
处理器中的PSW或CPSR(程序状态字)寄存器就是一个很好的例子。它对用户是只读的(例如const
),并且只有在系统执行算术或逻辑操作时(例如volatile
),系统才能对其进行修改
我希望这会有帮助。你的问题不清楚。@pranitkothari不,只是太宽泛了。+1是的,这是。“建议编译器在其他系统进程的操作过程中可以更改flag的值”特别好。@AhmedNour请编辑您的问题并更具体,并添加详细信息以缩小答案集,以便提供最佳答案。问这样一个宽泛的问题是不好的,因为你会有多个好的答案,而且答案可能会偏离实际要求。这只是一个建议,因为你是新来的。