>> 如果常量不存地址,那么常量怎么放在内存中?
原因已经说得很明白
--常量很可能因为编译器的优化而根本不存在地址的概念。因为它已经成为OPCODE的操作数
--的一部分了。”
如果也不明白我也没办法(因为要证明起码你要会汇编),下面我我试验给我看吧。
const int c1= 1;
const int c2= 9999;
char golvar=0;
int _tmain(int argc, _TCHAR* argv[])
{
argc= argc+c1;
argc= argc+c2;
argc*= golvar;
return argc;
}
00401000 >/$ 8B4424 04 mov eax, [esp+4]
00401004 |. 0FBE0D C07240>movsx ecx, byte ptr [golvar]
0040100B |. 05 10270000 add eax, 2710 //2710即10000
//经编译器优化你已经找不到常量
//的踪影了吧。
00401010 |. 0FAFC1 imul eax, ecx
00401013 /. C3 retn
>> 这句话是什么意思?局部变量在每一次进入函数时,应该算是重新被定义吧?每次进入
>>函数可能会不同,但是在函数内部,在它的生存期内难道地址不是保持不变的吗?
函数地址是不变的,但是函数的局部变量是 保存 在函数的外部的一个叫 堆栈 的地方的。
如果函数的局部变量保存在函数内部,那么多线程的情况下,几个线程同时调用某个函数,那不是会出现问题了吗? 事实上是不会的,因为 线程都有自己的堆栈空间。 而变量就保存在哪。
注:本人水平有限, 对于一些名字相似的名词可能记错,比如堆栈,或者堆、栈。请见谅。毕竟我只是业余的程序爱好者。