c ++中的const变量

时间:2011-02-14 20:03:56

标签: c++

这些是一些愚蠢的问题..我想问...请帮助我理解它

const int i=100;   //1
///some code
long add=(long)&i;  //2

怀疑:对于上面的代码......将首先编译整个代码 用于决定是否应该分配内存..或者首先它将存储
在只读内存位置变量,然后在2

处分配stroage

怀疑:为什么采用变量强制编译器的地址来将变量存储在内存中...甚至为什么 虽然rom或者注册也有地址

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

我从来没有编写过实现这个的编译器,但我认为将变量作为普通变量处理是简单的,但是使用变量值的常量值,如果地址是变量,则使用变量的地址。使用

如果在变量范围的末尾没有人接受地址,那么我可以放弃它而不是进行实际分配,因为对于所有其他用途,使用常量值而不是编译变量加载操作。 / p>

答案 2 :(得分:1)

常量值(不是const的唯一用途,但这里使用的值)不是“存储在普通存储器中”(当然也不存储在ROM中)。只要代码使用变量,编译器就会使用该值(在本例中为100)。

当然,如果该值未存储在任何地方,则该常量的地址没有意义。

const的其他用法存储在“普通内存”中,您可以获取它们的地址,但结果是“指向const值的指针”,因此(原则上)它不能用于修改值。当然,硬转换会改变它,因此它们会触发令人讨厌的编译器警告。

另外,请记住,C / C ++编译器完全在编译时运行(根据定义!),稍后某些部分使用会影响早期部分的代码生成并不罕见。

一个非常明显的例子是堆栈变量的声明:编译器必须考虑在任何给定级别声明的所有变量,以便能够在块条目中生成堆栈分配。

答案 3 :(得分:0)

答案 4 :(得分:0)

此代码中没有(动态)内存分配。在堆栈上创建两个局部变量。 i的地址被拍摄并残酷地投入到long中,然后将其分配给第二个变量。