以下'a'
是暂时的。
cout << 'a';
它不会在数据部分(const/static
does)中恢复,也不应该在堆栈中(局部变量 dos)。它在哪里?
更新
non-lvalue
和rvalue
是一回事吗?
除非你有一个非常糟糕的编译器或机器架构,'a'
否则不会在任何地方存储为数据。它是 asm 中的立即操作数,例如
mov $0x97, %eax
通常与代码内联;大多数现代 CPU 都有一个“立即移动”(迂腐,相对于 PC)指令,尽管一些较旧的 CPU 只能从指定的内存地址移动(这就是为什么用这种假设编写 Fortran,导致必须实际分配内存的常量) .
它可能是其中一条指令的操作数。
请参阅以下问题:
这将存储在哪里取决于您的编译器和您的架构。 '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)