0

以下'a'是暂时的。

cout << 'a';

它不会在数据部分(const/staticdoes)中恢复,也不应该在堆栈中(局部变量 dos)。它在哪里?

更新

non-lvaluervalue是一回事吗?

4

5 回答 5

2

除非你有一个非常糟糕的编译器或机器架构,'a'否则不会在任何地方存储为数据。它是 asm 中的立即操作数,例如

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

通常与代码内联;大多数现代 CPU 都有一个“立即移动”(迂腐,相对于 PC)指令,尽管一些较旧的 CPU 只能从指定的内存地址移动(这就是为什么用这种假设编写 Fortran,导致必须实际分配内存的常量) .

于 2011-05-30T02:28:30.240 回答
0

它可能是其中一条指令的操作数。

于 2011-05-30T02:27:21.533 回答
0

请参阅以下问题:

于 2011-05-30T02:41:27.053 回答
0

这将存储在哪里取决于您的编译器和您的架构。 'a'通常是一个值为 97 的 8 位量。根据特定体系结构的调用约定,它要么被压入堆栈,要么在调用过程之前移入寄存器operator<<(ostream&, char)'a'但是,这与存储在当前作用域无关,而是char在被调用者中设置-type参数的值;'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 回答