这些是一些愚蠢的问题..我想问...请帮助我理解它
const int i=100; //1
///some code
long add=(long)&i; //2
怀疑:对于上面的代码......将首先编译整个代码
用于决定是否应该分配内存..或者首先它将存储
在只读内存位置变量,然后在2
怀疑:为什么采用变量强制编译器的地址来将变量存储在内存中...甚至为什么 虽然rom或者注册也有地址
答案 0 :(得分:5)
答案 1 :(得分:1)
我从来没有编写过实现这个的编译器,但我认为将变量作为普通变量处理是简单的,但是使用变量值的常量值,如果地址是变量,则使用变量的地址。使用
如果在变量范围的末尾没有人接受地址,那么我可以放弃它而不是进行实际分配,因为对于所有其他用途,使用常量值而不是编译变量加载操作。 / p>
答案 2 :(得分:1)
常量值(不是const
的唯一用途,但这里使用的值)不是“存储在普通存储器中”(当然也不存储在ROM中)。只要代码使用变量,编译器就会使用该值(在本例中为100)。
当然,如果该值未存储在任何地方,则该常量的地址没有意义。
const
的其他用法存储在“普通内存”中,您可以获取它们的地址,但结果是“指向const值的指针”,因此(原则上)它不能用于修改值。当然,硬转换会改变它,因此它们会触发令人讨厌的编译器警告。
另外,请记住,C / C ++编译器完全在编译时运行(根据定义!),稍后某些部分使用会影响早期部分的代码生成并不罕见。
一个非常明显的例子是堆栈变量的声明:编译器必须考虑在任何给定级别声明的所有变量,以便能够在块条目中生成堆栈分配。
答案 3 :(得分:0)
答案 4 :(得分:0)
此代码中没有(动态)内存分配。在堆栈上创建两个局部变量。 i的地址被拍摄并残酷地投入到long中,然后将其分配给第二个变量。