LINUX.ORG.RU

История изменений

Исправление xaizek, (текущая версия) :

Т. е. правило «as-if» распространяется и на такие низкоуровневые побочные эффекты, как количество и порядок вызовов аллокатора?

Раз copy ellision разрешено, то выделение памяти должно быть можно пропускать хотя бы для него. Другой вопрос, что это решать компилятору на основе его эвристик, которые ничего не гарантируют (если сможет доказать, что разницы не будет, то соптимизурует).

На побочные эффекты copy ellision может закрыть глаза:

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class
object, even if the constructor selected for the copy/move operation and/or the destructor for the object
have side effects.
Может в моём случае это работает (передача в качестве аргумента по ссылке, мне кажется, предотвращает эту оптимизацию):
— when a temporary class object that has not been bound to a reference (12.2) would be copied/moved
to a class object with the same cv-unqualified type, the copy/move operation can be omitted by
constructing the temporary object directly into the target of the omitted copy/move

Исходная версия xaizek, :

Т. е. правило «as-if» распространяется и на такие низкоуровневые побочные эффекты, как количество и порядок вызовов аллокатора?

Раз copy ellision разрешено, то выделение памяти должно быть можно пропускать хотя бы для него. Другой вопрос, что это решать компилятору на основе его эвристик, которые ничего не гарантируют (если сможет доказать, что разницы не будет, то соптимизурует).

На побочные эффекты copy ellision может закрыть глаза:

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class
object, even if the constructor selected for the copy/move operation and/or the destructor for the object
have side effects.
Может в моём случае это работает (передача в качестве аргумента, мне кажется, предотвращает эту оптимизацию):
— when a temporary class object that has not been bound to a reference (12.2) would be copied/moved
to a class object with the same cv-unqualified type, the copy/move operation can be omitted by
constructing the temporary object directly into the target of the omitted copy/move