常数如何表示? [关闭]
Posted
技术标签:
【中文标题】常数如何表示? [关闭]【英文标题】:How is constant represented? [closed] 【发布时间】:2014-08-27 09:35:33 【问题描述】:我想知道一个变量是否被声明为 volatile 常量,是否可以使用 i/o 或任何外围设备来更改它? 例如: 易失性常量 int 输入 = 0; 这样的变量也可以存储在内存的什么地方?
【问题讨论】:
你的问题不清楚。 @pranitkothari 不,它太宽泛了。 【参考方案1】:当变量定义为const
时,系统将其作为只读变量。不应修改其值的变量。但是,通过将变量定义为volatile
,程序员要求编译器避免编译器优化。
举个例子:
volatile const int flag = 0;
上面写着flag
是一个变量,它的值不应该被修改,并要求编译器避免编译器优化,意思是暗示编译器可以在运行过程中被其他系统进程改变flag的值。
一个很好的例子是处理器中的 PSW 或 CPSR(程序状态字)寄存器。它对用户是只读的(const
的示例),并且只能在系统执行算术或逻辑运算时由系统修改(volatile
的示例)。
希望对你有帮助。
【讨论】:
+1 是的。 “建议编译器在运行过程中可以被其他一些系统进程改变flag的值”特别好。 @AhmedNour 请编辑您的问题并更加具体并添加详细信息以缩小答案集,以便提供最佳答案。问这样一个广泛的问题并不是一个好习惯,因为您将有多个好的答案和可能偏离实际要求的答案。 只是一个建议,因为您是 SO 新手。【参考方案2】:这完全取决于编译器,受相关标准引入的任何限制的约束。假设您可以获取一个常量的地址并将其分配给一个指针,您可以推测该常量在该实例中占用了内存。
但这并没有真正暗示常量是如何存储在内存中的。如果这样做没有副作用,编译器可以完全优化它们。或者,const char* foobar = "foobar"
和 const char* bar = "bar"
甚至可能不会占据不相交的位置:尝试修改其中任何一个(正式未定义的行为)将是灾难性的。使用 volatile
确实会抑制一些优化,但确切的行为仍然取决于编译器。
【讨论】:
以上是关于常数如何表示? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章