Способы случайно создать временные объекты в C++?

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

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

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

Есть еще какие-нибудь?

7
задан Rob W 9 July 2012 в 21:03
поделиться

3 ответа

Я бы сказал, что это определенно ошибка в AjaxControlToolkit, и рекомендовал бы вам создать ошибку на CodePlex. Он должен использовать ReireWriteLock (Slim).

-121--4435127-

Более подходящим решением может быть фильтрация связанной коллекции, если нет особой необходимости в этих скрытых предметах. Что-то вроде

items.Where(i => i.IsInLanguage(currentLanguage));

Обновить:

Что касается меня, я бы использовал такой подход:

var items = db.
      Where(i => i.IsInLanguage(currentLanguage)).
      Where(i => i.SomeField == anotherFilterParameter);

repeater.DataSource = items;
repeater.DataBind();

Так что вся фильтрация применяется заранее

Это также сократит количество обходов базы данных, что играет на повышение производительности

-121--1930370-

12,2 Временные объекты

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

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

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

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

Компилятор не создает временные элементы неявно - он подчиняется стандарту. Если, конечно, при вызове неопределенного поведения. Следует отметить, что существует что-то, называемое оптимизацией копируемых и возвращаемых значений, что может фактически уменьшить количество временных элементов, которые в противном случае были бы созданы.

2
ответ дан 7 December 2019 в 14:32
поделиться

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

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

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

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

2
ответ дан 7 December 2019 в 14:32
поделиться

Интересная ссылка об общих ловушках, связанных с этой темой:

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

0
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: