LINUX.ORG.RU

[C++] эффективная передача параметров функции?

 


0

0

Допустим, я декларирую одну функцию сначала так:

int func(int&,int&); // передаю не сами переменные, а "алиасы"

потом меняю вот на это:

int func(int*,int*); // передаю указатели на переменные

Вопрос: в чем принципиальное различие второго метода от третьего? При каком расходуется меньше памяти? Спасибо.

★★

> Вопрос: в чем принципиальное различие второго метода от третьего?

Различие _только_ в удобстве написания '.' вместо '->'.

> При каком расходуется меньше памяти? Спасибо.

Одинаково. Внутренне ссылке это тоже указатели.

anonymous
()
Ответ на: комментарий от norden

> Большое спасибо!

Большое пожалуйста ;)

anonymous
()

Надо добавить, если отбросить тривиальные случаи, типа твоего примера, то предпочтительнее передавать ссылки, т.к. экономится проверка на NULL.

eRazor ★★★
()
Ответ на: комментарий от anonymous

>> Вопрос: в чем принципиальное различие второго метода от третьего?

> Различие _только_ в удобстве написания '.' вместо '->'.

>> При каком расходуется меньше памяти? Спасибо.

> Одинаково. Внутренне ссылке это тоже указатели.

Полное враньё.

В случае ссылки имеем сразу адрес объекта.

В случае указателя имеем адрес ячейки, где лежит адрес объекта.

Сравни &arg для указателя и ссылки.

anonymous
()
Ответ на: комментарий от anonymous

>Полное враньё.

>В случае ссылки имеем сразу адрес объекта.

>В случае указателя имеем адрес ячейки, где лежит адрес объекта.

>Сравни &arg для указателя и ссылки.

Сам ты вранье. Все правильно человек говорит - реализуются ссылки и указатели одинаково. В обоих случаях передается адрес объекта. Просто семантика операций над ними разная.

int func(string* a, string& b) { }

В обоих случаях передается 4 байта (зависит от платформы, конечно).

WFrag ★★★★
()

> int func(int&,int&); // передаю не сами переменные, а "алиасы" > int func(int*,int*); // передаю указатели на переменные

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

int func(const int&, const int&);

если аргументы только для чтения - тогда через два месяца глянув на код, будешь знать, что возвращается только одно значение, а через аргументы результата не будет...

Spectr ★★★
()
Ответ на: комментарий от WFrag

>Сам ты вранье. Все правильно человек говорит - реализуются ссылки и указатели одинаково.

Гон! Ссылка может вообще не иметь "инкарнации" т.е. физической сущности. Ссылка это АЛИАС!!! Это абстракция и её внутренне представление компилятором никакого отношения не имеет к внутреннему представлению указателя.

eRazor ★★★
()
Ответ на: комментарий от eRazor

> Гон! Ссылка может вообще не иметь "инкарнации" т.е. физической сущности. Ссылка это АЛИАС!!! Это абстракция и её внутренне представление компилятором никакого отношения не имеет к внутреннему представлению указателя.

это если функция, в которую ты их передаешь, будет инлайн-оптимизирована. Но в таком случае указатели тоже будут оптимизированы. Если инлайн-оптимизации нет, то передача ссылок НИЧЕМ не отличается от передачи указателя.

dilmah ★★★★★
()
Ответ на: комментарий от eRazor

>Гон! Ссылка может вообще не иметь "инкарнации" т.е. физической сущности. Ссылка это АЛИАС!!! Это абстракция и её внутренне представление компилятором никакого отношения не имеет к внутреннему представлению указателя.

Про инкарнации - это сильно. :) Я тебе еще раз говорю, ссылка РЕАЛИЗУЕТСЯ так же, как и указатель (т.е просто переменной, содержащей адрес объекта). Просто используется по другому. Например, ссылка обязательно должна быть проинициализирована и изменить ссылку уже нельзя - она всегда содержит адрес объекта, которым была проинициализирована, а все операции (например, присваивание) производятся над объектом, адрес которого содержится в ссылке. Когда ты передаешь объект по ссылке, то передается АДРЕС ОБЪЕКТА. Абсолютно так же, как и в случае с указателем.

Возьми код, откомпилируй и посмотри ассемблерный исходник. Ты увидишь, что ссылка и указатель в низкоуровневой реализации не будут отличаться. А значит ответ на вопрос, есть ли различия по памяти - НЕТ различий.

Все различие - в семантике операций. Просто &ref возвратит не адрес самой ссылки (т.е той ячейки, где хранится адрес объекта), а адрес, хранящийся в ней (т.е адрес объекта, на который ссылается ссылка).

Если хочешь убедить меня в обратном - приведи пример, и я объясню где ты заблуждаешься (или пойму, где сам заблуждаюсь). :)

P.S. Не могу не выпендриться (но это ни в коем случае не предъявляется как обоснование :) ) - http://tinyurl.com/4ru9q

WFrag ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.