Как временная реализация в C ++? - PullRequest
0 голосов
/ 30 мая 2011

В следующем 'a' является временным.

cout << 'a';

Он не восстанавливается в разделе данных (const/static делает) и не должен находиться в стеке (локальная переменная делает). Где это?

UPDATE

non-lvalue и rvalue - это одно и то же?

Ответы [ 5 ]

2 голосов
/ 30 мая 2011

Если у вас нет действительно ужасной архитектуры компилятора или машины, 'a' нигде не сохраняется как данные. Это непосредственный операнд в asm, например

mov $0x97, %eax
2 голосов
/ 30 мая 2011

в соответствии с кодом, обычно;большинство современных процессоров имеют команду «немедленно переместить» (педантично, относительную к ПК), хотя некоторые старые процессоры могут перемещаться только с указанных адресов памяти (именно поэтому Fortran был написан с таким предположением, в результате чего константы фактически должны быть выделены памяти).

0 голосов
/ 30 мая 2011

Где это будет храниться, зависит от вашего компилятора и вашей архитектуры. '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)
0 голосов
0 голосов
/ 30 мая 2011

Вероятно, это операнд одной из инструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...