С++ Экономичней ли по времени/памяти передача базовых типов по ссылке?

152
06 декабря 2018, 21:40

Допустим, будет ли выигрыш по времени выполнения/памяти во втором случае или нет?

 void f(int x)
{
  cout << x;
}
void f(const int &x)
{
  cout << x;
}

Если передать объект по значению, то вызовется конструктор копирования, а после выхода из тела функции -- деструктор. Теоретически, это тоже занимает время. А что происходит, когда передается ссылка? И сколько памяти она занимает? Для какого-нибудь "увесистого" объекта выигрыш по памяти точно будет, это понятно, а вот как лучше поступать с базовыми типами -- вопрос.

Answer 1

Теоретически сам вывод в консоль займет настолько больше времени, чем передача аргумента (которой из-за оптимизатора скорее всего не будет вообще), что уж этим эффектом точно можно пренебречь...

Вот смотрите, на VC++ 2017:

void f(int x)
{
  cout << x;
}
void g(const int &x)
{
  cout << x;
}
int main(int argc, const char * argv[])
{
    int x;
    cin >> x;
    f(x);
    g(x);
}

И что мы видим?

main    PROC                        ; COMDAT
; 18   : {
$LN8:
    sub rsp, 40                 ; 00000028H
; 19   :     int x;
; 20   :     cin >> x;
    lea rdx, QWORD PTR x$[rsp]
    lea rcx, OFFSET FLAT:?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A ; std::cin
    call    ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z ; std::basic_istream<char,std::char_traits<char> >::operator>>
; 10   :   cout << x;
    mov edx, DWORD PTR x$[rsp]
    lea rcx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
    call    ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
; 14   :   cout << x;
    mov edx, DWORD PTR x$[rsp]
    lea rcx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
    call    ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
; 21   :     f(x);
; 22   :     g(x);
; 23   : }
    xor eax, eax
    add rsp, 40                 ; 00000028H
    ret 0
main    ENDP

Именно то, что я и говорил: вызова как такового нет, функция заинлайнена, все строго одинаково...

READ ALSO
Хэширование bcrypt C++

Хэширование bcrypt C++

Как реализовать хэширование в C++Например:

197
Конструкторы в C++

Конструкторы в C++

Читал статью на MSDN и там был такой код:

147
Коментарии в GSON

Коментарии в GSON

В Gson имеется такая возможность как полный контроль над этапом Serializer и Deserializer объекта

135
Android MediaPlayer по URL

Android MediaPlayer по URL

На сервере лежат довольно большие файлы в формате mp3, есть необходимость прослушать их не с начала, а с определенного местаПри вызове seekTo()...

175