2011-05-30 70 views
0

在以下'a'是暫時的。在C++中如何臨時實現?

cout << 'a'; 

它不是在數據部分恢復(const/static那樣),不應該在棧(局部變量一樣)。它在哪裏?

UPDATE

non-lvaluervalue是一回事嗎?

+2

但是''a''是字符文字,而不是暫時的。真正的臨時工將在堆疊上。 – QuantumMechanic 2011-05-30 02:25:55

+0

@QuantumMechanic,所以''a''在數據部分? – cpuer 2011-05-30 02:26:47

回答

2

除非你有一個非常可怕的編譯器或計算機體系結構,'a'不存儲數據。它是一個直接操作數,例如

mov $0x97, %eax 
+0

@R ..如果'cout <<「abc」''怎麼辦?如果那還不是暫時的,你能舉一個例子嗎? – cpuer 2011-05-30 02:30:27

+0

哦,我看到'b * c'是一個臨時的,其中'b','c'是變量。 – cpuer 2011-05-30 02:35:10

+0

這不是一個臨時的。這是一個字符串文字。它將被分配一個固定地址(通常在「文本」(代碼)或只讀數據段中),字符串的絕對地址或相對地址將在asm中被髮送以訪問它。 – 2011-05-30 02:36:09

0

這可能是1個指令的操作數。

2

內聯代碼,通常;最現代的CPU有一個「移動即時」(迂腐,PC相關)指令,但也有一些舊的CPU只能從指定的存儲器地址移動(這就是爲什麼FORTRAN語言與假設寫,導致常量不必實際可分配的內存) 。

0

如果這將存儲取決於你的編譯器和體系結構。 '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)