如何在C ++中临时实现?

时间:2011-05-30 02:23:32

标签: c++ temporary

以下'a'是暂时的。

cout << 'a';

它没有在数据部分中恢复(const/static确实)并且不应该在堆栈中(局部变量确实)。它在哪里?

更新

non-lvaluervalue是一回事吗?

5 个答案:

答案 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)