0

以下'a'は一時的なものです。

cout << 'a';

これはデータ セクションでは復元されず ( const/staticdoes)、スタック内にあってはなりません (local variable dos)。それはどこにある?

アップデート

non-lvaluervalue同じことですか?

4

5 に答える 5

2

本当にひどいコンパイラまたはマシン アーキテクチャを使用していない限り、'a'どこにもデータとして保存されません。asm の即値オペランドです。たとえば、

mov $0x97, %eax
于 2011-05-30T02:28:00.533 に答える
2

通常、コードに沿ってインライン化します。一部の古い CPU は指定されたメモリ アドレスからしか移動できませんでしたが (そのため、Fortran はその仮定で書かれ、結果として定数を実際に割り当てられたメモリにする必要があります)。 .

于 2011-05-30T02:28:30.240 に答える
0

おそらく、いずれかの命令のオペランドです。

于 2011-05-30T02:27:21.533 に答える
0

次の質問を参照してください。

于 2011-05-30T02:41:27.053 に答える
0

これが格納される場所は、コンパイラとアーキテクチャによって異なります。 通常、値は 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)
于 2011-05-30T02:41:55.537 に答える