【发布时间】:2015-01-10 17:08:24
【问题描述】:
让我们看看这段代码:
int main ()
{
int a = 5;
int&b = a;
cout << a << endl; // 5 is displayed
cout << b << endl; // 5 is also displayed
return 0;
}
这是我在调试器中看到的行为。
int a = 5 将在内存地址-0x14(%rbp) 中赋值5
int& b = a 将在内存地址-0x8(%rbp) 中赋值-0x14(%rbp)
当我执行cout << a << endl 时,将显示 a 地址中的值(即 -0x14(%rbp))。
但不知何故,当我执行cout << b << endl 时,b 地址中的值(即-0x8(%rbp))被确定为地址,然后显示该地址的值(-0x14(%rbp))。
这是 std::cout 调用的程序集:
20 cout << a << endl;
0000000000401506: mov -0xc(%rbp),%eax
0000000000401509: mov %eax,%edx
000000000040150b: lea 0x6f8c9c6e(%rip),%rcx # 0x6fccb180 <libstdc++-6!_ZSt4cout>
0000000000401512: callq 0x4015f8 <_ZNSolsEi>
0000000000401517: lea 0xe2(%rip),%rdx # 0x401600 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_>
000000000040151e: mov %rax,%rcx
0000000000401521: callq 0x401608 <_ZNSolsEPFRSoS_E>
21 cout << b << endl;
0000000000401526: mov -0x8(%rbp),%rax
000000000040152a: mov (%rax),%eax
000000000040152c: mov %eax,%edx
000000000040152e: lea 0x6f8c9c4b(%rip),%rcx # 0x6fccb180 <libstdc++-6!_ZSt4cout>
0000000000401535: callq 0x4015f8 <_ZNSolsEi>
000000000040153a: lea 0xbf(%rip),%rdx # 0x401600 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_>
0000000000401541: mov %rax,%rcx
0000000000401544: callq 0x401608 <_ZNSolsEPFRSoS_E>
24 return 0;
问题:
两个 std::cout 指令非常相似,a 与 b 的处理方式有何不同?
【问题讨论】:
-
这不是 CPU 所做或理解的事情。这是语言的规则。您的编译器告诉 CPU 取消引用该引用。