以下'a'
是暂时的。
cout << 'a';
它没有在数据部分中恢复(const/static
确实)并且不应该在堆栈中(局部变量确实)。它在哪里?
更新
non-lvalue
和rvalue
是一回事吗?
答案 0 :(得分:2)
除非你有一个非常糟糕的编译器或机器架构,否则'a'
不会作为数据存储在任何地方。它是asm中的一个直接操作数,例如
mov $0x97, %eax
答案 1 :(得分:2)
通常与代码内联;虽然一些较旧的CPU只能从指定的内存地址移动(这就是为什么Fortran是用这种假设编写的,导致常量必须实际分配内存),大多数现代CPU都有“立即移动”(迂回,PC相关)指令。
答案 2 :(得分:0)
这可能是其中一条指令的操作数。
答案 3 :(得分:0)
请参阅以下问题:
答案 4 :(得分:0)
存储的位置取决于您的编译器和架构。 'a'
通常是一个8位数量,值为97.根据您的特定体系结构的调用约定,它将被推入堆栈或在过程operator<<(ostream&, char)
之前移入寄存器调用。但是,这与在当前作用域中存储'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)