Что лучше (по скорости) передавать значение числа или адрес 4хбайтного числа?
void f1(int i);
void _f1(const int i);
void f2(const int &i);
Так же вопросы:
f1
и _f1
?UDP: после того как заминусовали
Вопрос возник после того как в Qt Creator воспользовался быстрыми подсказками для установки значения поля. И для uint32_t
он создавал через константную ссылку. И сейчас выяснил, что такое поведение для всех нестандартных типов. Например для того же unsigned int
будет создан метод с передачей по значению. Пример:
class C {
uint32_t t;
unsigned int tt;
public:
void setT(const uint32_t &value); // эти методы создал Qt Creator
void setTt(unsigned int value); // эти методы создал Qt Creator
};
Как минимум между f1
и _f1
разница только в том, что в первой функции можно менять значение i
, во второй - нет, и не более того. Разницы в передаче нет.
При передаче по ссылке скорее всего компилятор соптимизирует все разыменования внутри функции, так что с оптимизацией коды, скорее всего, отличаться сильно не будут. Без оптимизации - основная проблема не в передаче адреса или значения, а в использовании внутри функции значения, переданного по ссылке - что требует разыменования.
"По-моему, так". (с) Пух
Вот что делает без оптимизации из
int f1(int i)
{
return i*i;
}
int f2(const int& i)
{
return i*i;
}
компилятор VC++ 2017
?f2@@YAHAEBH@Z PROC ; f2
; 14 : {
mov QWORD PTR [rsp+8], rcx
; 15 : return i*i;
mov rax, QWORD PTR i$[rsp]
mov rcx, QWORD PTR i$[rsp]
mov eax, DWORD PTR [rax]
imul eax, DWORD PTR [rcx]
; 16 : }
ret 0
?f2@@YAHAEBH@Z ENDP ; f2
?f1@@YAHH@Z PROC ; f1
; 9 : {
mov DWORD PTR [rsp+8], ecx
; 10 : return i*i;
mov eax, DWORD PTR i$[rsp]
imul eax, DWORD PTR i$[rsp]
; 11 : }
ret 0
?f1@@YAHH@Z ENDP ; f1
Т.е. основная разница - в косвенном обращении внутри функции, а не в передаче...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Проблема с адаптивностью сайтаЯ новичок, поэтому не особо разбираюсь как правильно писать адаптивность