关于const的一个问题
图2:minGW编译的输出
const C C++
[解决办法]
void constProblem(void)与常量折叠有关, 是优化的结果。
void constProblem2(void)是认识错误。
//表示不能通过num修改num_pre,不表示num_pre是只读的。
const int &num = num_pre;
int main()
{
01151250 push ebp
01151251 mov ebp,esp
01151253 push ecx
//常量折叠
{
int const i = 5;
*(int*)&i = 6;
printf("%d\n", i);
01151254 push 5
01151256 push 1160334h //"d\n"的地址
0115125B mov dword ptr [i],6 // *(int*)&i = 6
01151262 call printf (01152013h) //执行printf("%d\n", 5) ,这就是常量折叠
//此时i虽然为6,但没有读取i的值。理由是:编译器认为, i是只读的,所以他相信i的值始终为1
//出现问题的原因是你"出尔反尔"了,没有让i的值只读
printf("%d\n", *(int volatile*)&i);
01151267 mov eax,dword ptr [i] //此时i为6
0115126A push eax
0115126B push 1160334h //"d\n"的地址
01151270 call printf (01152013h) //执行printf("%d\n", i),此时i为6
01151275 add esp,10h
}
return 0;
01151278 xor eax,eax
}
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!