在以下'a'
是暫時的。在C++中如何臨時實現?
cout << 'a';
它不是在數據部分恢復(const/static
那樣),不應該在棧(局部變量一樣)。它在哪裏?
UPDATE
是non-lvalue
和rvalue
是一回事嗎?
在以下'a'
是暫時的。在C++中如何臨時實現?
cout << 'a';
它不是在數據部分恢復(const/static
那樣),不應該在棧(局部變量一樣)。它在哪裏?
UPDATE
是non-lvalue
和rvalue
是一回事嗎?
除非你有一個非常可怕的編譯器或計算機體系結構,'a'
不存儲數據。它是一個直接操作數,例如
mov $0x97, %eax
這可能是1個指令的操作數。
內聯代碼,通常;最現代的CPU有一個「移動即時」(迂腐,PC相關)指令,但也有一些舊的CPU只能從指定的存儲器地址移動(這就是爲什麼FORTRAN語言與假設寫,導致常量不必實際可分配的內存) 。
如果這將存儲取決於你的編譯器和體系結構。 'a'
一般是根據特定架構的調用約定值97的8位二進制數,它要麼在棧上只是程序operator<<(ostream&, char)
被稱爲推前或移動到寄存器中。然而,這沒有任何關係,在當前範圍內存儲'a'
,但設置在被叫方的char
型參數的值; 'a'
從不存儲在當前範圍內。這可以在大多數體系結構中的一個或兩個彙編指令中完成,並且不需要存儲在靜態段,堆或堆棧中(除非參數在堆棧中傳遞) - 只需要一兩個指令中的幾個位。
例如:
IA-32:
pushl $0x61
pushl ... # address of cout
call ... # address of operator<<(ostream&, char)
MIPS
-32:
addiu $a0, $zero, 0x61
addiu $a1, $zero, ... # address of cout
jal ... # address of operator<<(ostream&, char)
但是''a''是字符文字,而不是暫時的。真正的臨時工將在堆疊上。 – QuantumMechanic 2011-05-30 02:25:55
@QuantumMechanic,所以''a''在數據部分? – cpuer 2011-05-30 02:26:47