Skip to content

[Question] Over-constrained checks in function parameter passing optimization #1206

Description

@ddvamp

// See also: https://www.agner.org/optimize/calling_conventions.pdf
template<class T>
inline constexpr auto _select_param_type = []
{
if constexpr (std::is_trivially_copyable_v<T>)
return _type_identity<T>();
else
return std::add_rvalue_reference<T>();
};

Данная проверка используется для определения типа параметров внутренней функции в function_ref, при вызове которой передаются уже скопированные аргументы. is_trivially_copyable является избыточной, поскольку проверяет неиспользуемую в реализации функциональность. В этом случае достаточно проверять is_trivially_move_constructible и is_trivially_destructible, как например реализовано в gcc.

Также у них ограничивается размер типа. В текущей реализации возможны сценарии, когда большие trivially_copyable объекты избыточно копируются (к примеру, класс содержащий массив).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions