Почему Itanium ABI требует, чтобы некоторые параметры значения были размещены в памяти и переданы по ссылке?

Если тип параметра является нетривиальным для целей вызовов, вызывающий должен выделить пространство для временного и передать это временное по ссылке.

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#value-parameter

И * нетривиальный для целей звонков определяется как:

  • у него есть нетривиальный конструктор копирования, конструктор перемещения или деструктор
  • все его конструкторы копирования и перемещения удаляются.

https://itanium-cxx-abi.github.io/cxx-abi/abi.html#non-trivial

Есть ли для этого явная причина?


person lz96    schedule 16.11.2018    source источник
comment
Это обычный механизм передачи по значению без регистрации. (Передача по значению аналогична созданию копии и передаче копии по ссылке). Типы, которые являются тривиальными для целей вызовов, могут передаваться в регистрах.   -  person M.M    schedule 16.11.2018
comment
@ M.M Что меня смущает, так это то, почему типы, которые могут идеально вписаться в регистр (например, std :: unique_ptr), должны передаваться по ссылке, потому что у него нетривиальный деструктор? Это поведение подразумевается спецификацией, что вызывающий вызывает ctor / dtor аргументов? Если да, то почему бы не разрешить вызываемому объекту уничтожить аргумент при передаче по значению? Это принудительное исполнение делает невозможным устранение проверки unique_ptr уничтожения при вызове по значению (см. stackoverflow.com/questions/53330428/)   -  person lz96    schedule 16.11.2018