У меня есть вопрос о производительности. Я думаю, что это может также относиться к другим языкам (не только C ++).
Представь, что у меня есть эта функция:
int addNumber(int a, int b){
int result = a + b;
return result;
}
Есть ли улучшение производительности, если я напишу код выше, как это?
int addNumber(int a, int b){
return a + b;
}
У меня есть этот вопрос, потому что вторая функция не объявляет третью переменную. Но обнаружит ли компилятор это в первом коде?
Ответить на этот вопрос вы можете посмотрите на сгенерированный ассемблерный код. С -O2, x86-64 gcc 6.2 генерирует абсолютно одинаковый код для обоих методов:
addNumber(int, int):
lea eax, [rdi+rsi]
ret
addNumber2(int, int):
lea eax, [rdi+rsi]
ret
Только без оптимизации, есть разница:
addNumber(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov DWORD PTR [rbp-24], esi
mov edx, DWORD PTR [rbp-20]
mov eax, DWORD PTR [rbp-24]
add eax, edx
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
addNumber2(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
mov edx, DWORD PTR [rbp-4]
mov eax, DWORD PTR [rbp-8]
add eax, edx
pop rbp
ret
Однако сравнение производительности без оптимизации не имеет смысла
В принципе нет разницы между этими двумя подходами. Большинство компиляторов обрабатывали этот тип оптимизации в течение нескольких десятилетий.
Кроме того, если функция может быть встроенной (например, ее определение видно компилятору при компиляции кода, использующего такую функцию), большинство компиляторов полностью исключают функцию и просто генерируют код, чтобы добавить две переданные переменные и сохранить результат. как требуется вызывающим абонентом.
Очевидно, что приведенные выше комментарии предполагают компиляцию с соответствующими настройками оптимизации (например, не выполнять отладочную сборку без оптимизации).
Лично я бы не стал писать такую функцию в любом случае. В звонилке проще написать c = a + b
вместо c = addNumber(a, b)
таким образом, наличие подобной функции не приносит никакой пользы ни программисту (попытка понять), ни программе (производительность и т. д.). Вы также можете написать комментарии, которые не дают полезной информации.
c = a + b; // add a and b and store into c
Любой уважающий себя рецензент кода будет горько жаловаться на неинформативные функции или неинформативные комментарии.
Я бы использовал такую функцию только в том случае, если ее имя передавало какое-то особое значение (т. Е. Больше, чем просто добавление двух значений) для приложения.
c = FunkyOperation(a,b);
int FunkyOperation(int a, int b)
{
/* Many useful ways of implementing this operation.
One of those ways happens to be addition, but we need to
go through 25 pages of obscure mathematical proof to
realise that
*/
return a + b;
}