Что лучше передавать значение числа или адрес? [дубликат]

80
10 апреля 2021, 15:00
На этот вопрос уже даны ответы здесь:
Передача интегральной переменной в функцию: по значению или по ссылке? (5 ответов)
Закрыт 1 год назад.

Что лучше (по скорости) передавать значение числа или адрес 4хбайтного числа?

void f1(int i);
void _f1(const int i);
void f2(const int &i);

Так же вопросы:

  1. Если лучше передавать адрес у 4хбайтного числа, а с булевыми переменными так же?
  2. Есть разница между f1 и _f1?
  3. Есть ли разница если компилятор для x86/x64?
  4. Мысли)

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
};
Answer 1

Как минимум между 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

Т.е. основная разница - в косвенном обращении внутри функции, а не в передаче...

READ ALSO
Как сделать адаптивность сайта?

Как сделать адаптивность сайта?

Проблема с адаптивностью сайтаЯ новичок, поэтому не особо разбираюсь как правильно писать адаптивность

119