Здравствуйте, kvasya, Вы писали:
K>какая из реализаций более эффективна на ваш взгляд?
Если функция компилируется в несколько элементарных команд, и объявлена инлайновой — второй вариант предпочтительнее, поскольку компилятор легко может встроить ее в любую формулу.
Если же функция мало-мальски нетривиальна, то разница в несколько тактов, что может набежать на лишних разыменованиях, вряд ли будет играть какую-то роль в эффективности.
K>position_t get_new_position(const position_t position)
K>{
K> for(int i = 0; i < 1000; i++)
K> position += some_offset; // хотя тут, конечно в случае константного оффсета цикл не нужен :)
K> return position;
K>}
K>
Здравствуйте, kvasya, Вы писали:
K>x64, какая из реализаций более эффективна на ваш взгляд? более предпочтительна? Ваше мнение.
Поскольку функции работают с типом, родным для платформы, то, предположительно, лучше выбрать ту, которая оперирует значениями, а не ссылкой на константу, и тем более, не указателем на неконстанту.
Тогда больше шансов, что всё обойдётся регистрами, и не потребуется приземлять значение в основную память.
Но, поскольку семантика использования функции — это автоинкремент, получается выбор между записями
x += n
x = x+n
Второе более многословно и грозит ошибками
pos1 = get_new_position_after(pos1);
pos1 = get_new_position_after(pos2); // вместо автоинкремента прибавили не к тому...
pos1 = get_new_position_after(pos2); // вместо автоинкремента прибавили опять к старому...
К>Поскольку функции работают с типом, родным для платформы, то, предположительно, лучше выбрать ту, которая оперирует значениями, а не ссылкой на константу, и тем более, не указателем на неконстанту. К>Тогда больше шансов, что всё обойдётся регистрами, и не потребуется приземлять значение в основную память.
Кстати, чего подумал...
Если профайлер покажет, что на этой функции наблюдается затуп из-за кешмиссов (из-за того, что переменная приземлилась-таки в память неудачным образом), то перепиши:
position_t get_new_position(position_t old); // здесь избавились от ссылки
// возможно, это облегчит жизнь компилятору, позволит ему оптимизировать реализациюinline void update_position(position_t& pos) // не даёт ошибиться, и легко инлайнится
{
pos = get_new_position(pos);
}