以下'a'
は一時的なものです。
cout << 'a';
これはデータ セクションでは復元されず ( const/static
does)、スタック内にあってはなりません (local variable dos)。それはどこにある?
アップデート
non-lvalue
とrvalue
同じことですか?
本当にひどいコンパイラまたはマシン アーキテクチャを使用していない限り、'a'
どこにもデータとして保存されません。asm の即値オペランドです。たとえば、
mov $0x97, %eax
通常、コードに沿ってインライン化します。一部の古い CPU は指定されたメモリ アドレスからしか移動できませんでしたが (そのため、Fortran はその仮定で書かれ、結果として定数を実際に割り当てられたメモリにする必要があります)。 .
おそらく、いずれかの命令のオペランドです。
次の質問を参照してください。
これが格納される場所は、コンパイラとアーキテクチャによって異なります。 通常、値は 97 の 8 ビット量です。特定のアーキテクチャの呼び出し規則に応じて、スタックにプッシュされるか、プロシージャが呼び出される'a'
直前にレジスタに移動されます。ただし、これは現在のスコープにoperator<<(ostream&, char)
格納することとは関係ありませんが、呼び出し先で -type パラメーターの値を設定します。現在のスコープに格納されることはありません。これは、ほとんどのアーキテクチャで 1 つまたは 2 つのアセンブリ命令で実行でき、静的セグメント、ヒープ、またはスタックに格納する必要はありません (パラメーターがスタックで渡されない限り)。1 つまたは 2 つの命令のほんの数ビットです。'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)