Object это «что-то в памяти». Это означает, что это что-то занимает часть адресного пространства процесса (либо в стеке, либо в «свободной» памяти). Также это означает, что вы можете получить его адрес, если хотите.
Временные объекты - это просто объекты. Компилятор генерирует код, чтобы создать их, если нужны такие объекты, чтобы вычислить выражение:
void f(const string&);
void g()
{
f(string("Hello"));
}
выражение, которое вызывает f() приведет к генерации кода, который:
- создает временный строковый объект. Конструктор вызывается с параметром const char *;
- вызывает f() со ссылкой на этот временный объект как параметр;
- уничтожает объект временной строки.
Ключевой частью этого является уничтожение временного объекта в конце оценки выражения. Временный объект существует только в самом выражении (то есть их временном использовании scope). Вы можете попробовать что-то вроде: const string* ps = &string("Hello")
, но ваш компилятор, вероятно, вызовет тревогу, потому что такое выражение приведет к созданию указателя, который ссылается на память, что был занят временным объектом, но больше не занят. Он может по-прежнему содержать элементы строкового объекта или может быть перезаписан следующими выражениями в программе (не говоря уже о том, что уничтожение временного объекта освободит память, выделенную кучей объектом).Использование ps
приведет к неопределенному поведению.
Другой вопрос, который возникает здесь, - это природа объектов в выражении типа int x = 12
. В этом случае x может быть объектом или может быть не. Это зависит от настроек компилятора и кода, следующего за строкой. Компилятор может захотеть разместить x в регистре. В таком случае x не будет объектом, потому что регистры не имеют адресов (по крайней мере, на большинстве платформ). Если вы не измените значение x
, компилятор может даже использовать 12 инструкций непосредственно. Таким образом, «12» будет существовать только в составе команд.
В любом случае, независимо от того, что происходит в следующем коде, int x = 12
не создает временный объект 12
. Если компилятор ПОСТОНАВЛЯЕТ поместить 12 в памяти инструкция будет как (псевдо-код):
store immediate address_of_x, 12
В случае х plased в регистрации у вас будет:
move immediate regX, 12
В обоих случаях, 12 будет быть частью инструкции (скомпилированного фрагмента кода). Таким образом, это не будет отдельный объект.
Err, '12' не является _объектом вообще, равно как и' x'. Вы можете выбрать лучший пример, например объект _real_. – paxdiablo
12 не является временным объектом - конечно, не в C, и, возможно, и не на C++. Это просто начальное значение для 'x'. Статус 'x' является неопределенным, потому что мы не можем видеть контекст, где он определен. (Или, если вы показываете все, что есть, это глобальная переменная.) –
Что такое 12? @paxdiablo –