|
|
1
5
通常,尤其是在启用优化时,编译器会尝试使常量尽可能有效。例如,如果您编写
直接使用的小常量通常被编码到指令的直接字段中。 如果编译器无法将常量放入指令的立即数字段,它通常会将其存储在只读内存中。 然而,您给出的示例使编译器很难做到这一点。示例中的代码:
如果您仅定义
但是,由于您获取了对象的地址,因此存在一个问题。例程可以递归调用。(您的程序不调用
但是,对象的不同实例可以通过其地址来区分。由于您获取对象的地址,编译器希望创建它的实际不同实例。在只读存储器中很难做到这一点。程序通常不会为只读内存维护堆栈,因此编译器无法方便地跟踪必须为只读内存中的对象创建的多个实例。(很难为只读内存维护堆栈。如果堆栈上的内容在不同时间可能不同,则该堆栈的内存必须更改。因此,即使堆栈上只有只读对象,堆栈本身也不能是只读的。)
因此,在本例中,编译器将
当然,这不是你可以信赖的行为。试图更改已定义对象的值
|
|
2
2
您发现了一个关于C中未定义行为的悲惨事实。 “编译和执行良好”确实 不 (非不可)证明该代码合法且正确!
如果你作弊,试着写信给
当你说
您的编译器应该已经警告过您,“警告:从‘const int*’分配给‘int*’会丢弃限定符”。(这正是我的编译器所说的。) 因此,是的,编译器完全有权在文本段或只读内存的其他部分中存储不可修改的常量。如果这意味着像你这样的程序失败了,那也没关系。
但还有一点。您声明的“常量”,
如果你
|
|
3
1
好吧,它们的存储方式取决于编译器的实现细节。然而,它通常存储在文本部分。
顺便说一句
|
|
4
0
A.
在您发布的情况下,当您使用
出于遗留代码兼容性的原因,这被视为警告而不是错误,因此您可以自由采取相应的行动(在本例中,您没有这样做:)) |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |