[英]How's a temporary implemented in C++?
在下面'a'
是一個臨時的。
cout << 'a';
它不會在數據部分中恢復( const/static
會),也不應該在堆棧中(局部變量會)。 它在哪里?
更新
non-lvalue
和rvalue
是一回事嗎?
除非您有一個非常糟糕的編譯器或機器架構,否則'a'
不會在任何地方存儲為數據。 它是 asm 中的立即操作數,例如
mov $0x97, %eax
通常與代碼內聯; 大多數現代 CPU 都有一個“立即移動”(迂腐,相對於 PC)指令,盡管一些較舊的 CPU 只能從指定的 memory 地址移動(這就是為什么 Fortran 是以該假設編寫的,導致常量必須實際分配內存) .
它可能是其中一條指令的操作數。
這將存儲在哪里取決於您的編譯器和您的架構。 'a'
通常是一個 8 位的數值,值為 97。根據特定架構的調用約定,它要么被壓入堆棧,要么在過程operator<<(ostream&, char)
之前移入寄存器叫做。 但是,這與當前 scope 中存儲'a'
無關,而是在被調用者中設置char
類型參數的值; 'a'
永遠不會存儲在當前的 scope 中。 這可以在大多數架構上通過一兩條匯編指令完成,並且不需要存儲在 static 段、堆或堆棧中(除非參數在堆棧上傳遞)——只需一兩條指令中的幾位。
例如:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.