Ничего особенного в перегрузках операторов или пользовательских литералах нет.
Если вы хотите дать компилятору наилучшую возможность оптимизировать скорость, возможно, заплатив с более длительным временем компиляции, а в некоторых ситуациях - с большими двоичными размерами , тогда вы должны следовать обычным правилам, которые применяются ко всем функциям.
Напишите небольшие функции, которые извлекли бы выгоду из встраивания в качестве встроенных функций в файл заголовка, так что компилятор всегда может решить встроить, если это необходимо.
Если встроена небольшая функция, вы вернетесь к выражениям, которые работают с примитивными типами, и компилятор может использовать те же методы оптимизации, которые вы уже упоминали.
Если компилятор не определится чтобы встроить вызов, то он, вероятно, не будет выполнять оптимизацию на основе математических свойств операторов, поскольку он не может предположить, что перегрузка оператора (или любая функция) является, например, коммутативной или ассоциативной, за исключением, может быть, в очень простых случаях (когда ich, вероятно, будет в любом случае встроенным).
Также убедитесь, что вы пометили каждую функцию, которой разрешено пометить constexpr
как таковую, чтобы было легче выполнять оценку во время компиляции и писать код в constexpr
-дружественный способ (т. Е. Используйте только литеральные типы).
Если вы недостаточно довольны оптимизацией, которую выполняет компилятор, то распространенным методом является использование шаблонов выражений метод для сбора деревьев выражений во время компиляции и выполнения собственных преобразований для них.