簡體   English   中英

在 C++ 中臨時如何實現?

[英]How's a temporary implemented in C++?

在下面'a'是一個臨時的。

cout << 'a';

它不會在數據部分中恢復( const/static會),也不應該在堆棧中(局部變量會)。 它在哪里?

更新

non-lvaluervalue是一回事嗎?

除非您有一個非常糟糕的編譯器或機器架構,否則'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM