Есть ли КАРДИНАЛЬНАЯ РАЗНИЦА в функциях ниже (*не учитывая как осуществляется вызов)?

212
14 апреля 2018, 20:37
void test(int* arg)
{
    *arg = 1;
}
void test(int& arg)
{
    arg = 2;
}

//*не учитывая как осуществляется вызов 1 или 2 способ (результат тот же)

int x = 0;
test(&x); // 1
test(x);  // 2
Answer 1

Вообще говоря - нет, не считая того, что в первую функцию можно передать несуществующий адрес (nullptr), а во вторую - только имеющуюся переменную (в широком смысле слова, lvalue).

Answer 2

Обе функции абсолютно идентичные. Код из дизассемблера visual studio.

    ;void test(int& arg)
009E16B0  push        ebp  
009E16B1  mov         ebp,esp  
009E16B3  sub         esp,0C0h  
009E16B9  push        ebx  
009E16BA  push        esi  
009E16BB  push        edi  
009E16BC  lea         edi,[ebp-0C0h]  
009E16C2  mov         ecx,30h  
009E16C7  mov         eax,0CCCCCCCCh  
009E16CC  rep stos    dword ptr es:[edi]  
    ;arg = 2;
009E16CE  mov         eax,dword ptr [arg]  
009E16D1  mov         dword ptr [eax],2  

    ;void test(int* arg)
009E16F0  push        ebp  
009E16F1  mov         ebp,esp  
009E16F3  sub         esp,0C0h  
009E16F9  push        ebx  
009E16FA  push        esi  
009E16FB  push        edi  
009E16FC  lea         edi,[ebp-0C0h]  
009E1702  mov         ecx,30h  
009E1707  mov         eax,0CCCCCCCCh  
009E170C  rep stos    dword ptr es:[edi]  
    ;*arg = 1;
009E170E  mov         eax,dword ptr [arg]  
009E1711  mov         dword ptr [eax],1 
Answer 3

Конкретно для ваших функций _ как сказал Harry, но когда видим в аргументе указатель, мы не знаем имеем ли мы дело с одним обьектом или с множеством таких обьектов. Любое арифметическое действие с указателем(если он не нулевой), приведет к тому, что мы будем работать уже с другим обьектом или с неопределенным участком памяти.

С аргументом ссылька, мы знаем, что в функцию передается конкретный обьект. Любое действие над ссылькой будет просто инвариантом обьекта, на который мы ссылались, поэтому безопасность обеспечена. Имея ввиду все это, всегда, когда имеете дело с конкретным одним обьектом, лучше работать со ссылькой, чем заморачиваться с указателем.

Answer 4

В случае с указателем с точки зрения клиента не очевидно, что переменная передается "по ссылке" (в том смысле, что копирования данных типа не происходит, в случае с настоящей C++-ссылкой это не так явно, ибо нет оператора взятия адреса &)

READ ALSO
QMultimedia::setPosition() не работает

QMultimedia::setPosition() не работает

Доброго времени сутокПишу mp3 плеер

209
Не могу понять ошибку No such slot

Не могу понять ошибку No such slot

Собственно пишет No such slot

204
Двоичный (бинарный) поиск (C++)

Двоичный (бинарный) поиск (C++)

Есть задание: Осуществить поиск указанного (с клавиатуры) элемента в массиве, используя указанный метод поиска)Метод поиска: Бинарный

207