Способы случайно создать временные объекты в C ++? - PullRequest
7 голосов
/ 08 февраля 2010

Несколько лет назад я считал, что C был абсолютно чист по сравнению с C ++, потому что компилятор не мог генерировать код, который вы не могли бы предсказать. Теперь я считаю, что примеры счетчиков включают ключевое слово volatile и барьеры памяти (в многопроцессорном программировании или драйверах устройств для отображаемых в памяти аппаратных устройств, где простой язык ассемблера был бы даже более чистым, чем оптимизация компилятора C).

В данный момент я пытаюсь перечислить непредсказуемые действия компилятора C ++. Основная претензия, которая запоминается в C ++, заключается в том, что компилятор неявно создает экземпляры временных объектов, но я полагаю, что все эти случаи вполне ожидаемы. Я думаю о следующих случаях:

  • когда класс определяет конструктор копирования для типа, отличного от самого себя, без использования ключевого слова explicit
  • когда класс определяет перегруженный оператор преобразования: operator ()
  • когда функция принимает объект по значению, а не по ссылке
  • когда функция возвращает объект по значению, а не по ссылке

Есть ли другие?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2010

12.2 Временные объекты

1 Временные объекты типа класса создаются в различных контекстах: привязка значения r к ссылке (8.5.3), возвращение значения r (6.6.3) преобразование, которое создает значение r (4.1, 5.2.9, 5.2.11, 5.4), выбрасывает исключение (15.1), вводит обработчик (15.3) и в некоторых инициализациях (8.5).

4 Существует два контекста, в которых временные уничтожаются в другой точке, чем конец фуллэкспрессии.

На самом деле я предлагаю взглянуть на все 12.2

В данный момент я пытаюсь перечислить непредсказуемые действия компилятора C ++.Основная претензия, которая мне запомнилась в отношении C ++, заключается в том, что компилятор неявно создает экземпляры временных объектов, но я полагаю, что все эти случаи можно ожидать.стандарт.Если, конечно, когда вы вызываете неопределенное поведение.Обратите внимание, что существует нечто, называемое оптимизацией копирования-возврата и возвращаемым значением, которое может на самом деле уменьшить количество временных объектов, которые в противном случае были бы созданы.

2 голосов
/ 08 февраля 2010

Полагаю, что «непредсказуемый» означает «что-то в соответствии со стандартом, но отличное от того, что программист ожидает при написании кода», верно?

Полагаю, вы можете видеть из кода, где объекты создаются или копируются, даже если это не очевидно. Это может быть трудно понять, хотя.

Некоторые вещи реализуются (всеми?) Поставщиками компиляторов определенным образом, но это может быть сделано по-другому. Например, позднее связывание (иначе называемое вызовом перегруженного виртуального метода) обычно реализуется с использованием указателей на функции в фоновом режиме. Это может быть самый быстрый способ сделать это, но я полагаю, что это может быть сделано по-другому, и это было бы неожиданно. Я не знаю ни одного компилятора, хотя он делает это по-другому.

Многие вещи неожиданны в том смысле, что C ++ слишком сложен - вряд ли кто-нибудь понимает полный язык. Так что неожиданное также зависит от ваших знаний.

0 голосов
/ 08 февраля 2010

Интересная ссылка о распространенных подводных камнях, связанных с этой темой:

http://www.gotw.ca/gotw/002.htm

...