47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
|
|
Как лучше передавать аргумент в функцию - по ссылке или по указателю?30.01.2016, 20:31. Показов 10940. Ответов 20
Метки нет Все метки)
(
Предположим, что нам нужно в функцию передать значение переменной чтобы по окончанию работы функции значение переменной изменилось. Меня интересует, что лучше использовать если мы знаем название переменной, ссылку или указатель? И что будет эффективнее? Мне кажется, что ссылка будет лучше, так как для указателя нужно выделять память чтобы он хранил адрес переменной. Но все используют указателя, а не ссылки.
0
|
30.01.2016, 20:31 | |
Ответы с готовыми решениями:
20
Передача параметров в функцию по значению, по ссылке или по указателю Зачем при перегрузке инкремента дружественной функцией передавать аргумент по ссылке? |
Модератор
![]() ![]() ![]() |
|
30.01.2016, 20:32 | |
maks242, ссылку проще. Разыменовывать не надо.
0
|
![]() |
|
30.01.2016, 20:36 | |
Используй ссылку. Она для этого и создана.
0
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
30.01.2016, 20:49 | ||||
![]() Решениепоскольку имеют больше шансов на оптимизацию. однако, в наши дни это уже не актуально. современные компиляторы прекрасно оптимизируют и ссылки, и указатели. но если в плане компиляторов и можно считать, что разницы нет, то с кодом программистов выползают самые перпендикулярные нюансы. инвариантный, грамотно оформленный код с ссылками более эффективен, нежели с указателями. например, потому что ссылки не нужно проверять на валидность. один лишь этот фактор делает код с ссылками более эффективным. если компилятору не доступен контекст использования ссылки, то он реализует её через механизм указателя. с другой стороны, если компилятору доступен контекст использования, то он и указатель сможет оптимизировать так же, как и ссылку. грамотные люди используют ссылки там, где ожидается работа с реальным (валидным) объектом. и указатели там, где ожидается работа с адресом, а объекта может и не быть. "указатели во все поля" - так делают либо совсем зеленые новички, либо сишники, которые так и не осилили плюсы, либо "священаы воены", которые любят кушать свой кактус, либо просто балбесы.
3
|
![]() |
|
30.01.2016, 20:57 | |
2
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
30.01.2016, 21:00 | ||||||||||||
может быть вот так вам будет более очевидно?
2
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||
30.01.2016, 22:23 | ||||||||||||||||||
когда нужно перенацеливаться. http://rextester.com/PYMJNF60861
не зная прототипа, вы не можете с 100% уверенностью сказать, какие гарантии даёт вам функция. но обычно, благодаря читабельным именам, и граммар конст, итак понятно, что сотворит функция с аргументами. ------------------------------------------------------------ существует соглашение о стиле кода, согласно которому, аргументы, которые могут быть модифицированы внутри функций, надлежит передавать по указателям. нотация берет свои корни из языка си, который не умеет ссылки, но хочет модифицировать указатели на языке с++ это выглядит так:
однако, сишка ссылки не умеет, и поэтому, там приходилось делать так:
что бы иметь возможность воздействовать на оригинальный указатель. на сишке просто нет иного способа, что бы поиметь желаемый профит. однако на плюсах все гораздо проще. и здесь такая нотация просто не актуальна.
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||
30.01.2016, 22:53 | ||||
Итого я то и сам использую const T& но есть же ж случаи когда я делаю &name - к своему стыду и малому опыту не могу навести сейчас пример, но он ведь есть же ж)
0
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||
30.01.2016, 23:34 | ||||||||||||||
гибкость нужна лишь там, где это объективно необходимо:
вопрос лишь в цене, и в целесообразности. если ожидается живой объект - проще и дешевле использовать ссылку. если же нужно будет перенацеливаться, то вам ничего не мешает повесить принимаемые данные на указатель, и менять его потом на что нибудь другое. Добавлено через 2 минуты если объект предназначен только для чтения, то он должен быть const если функция-член не изменяет состояние объекта, а выполняется только в режиме для чтения, то она должна быть const. вроде бы Маерс писал, если не ошибаюсь: "все, что может быть const, должно быть const"
2
|
Модератор
![]() ![]() ![]() |
||||
31.01.2016, 09:34 | ||||
У Макконнелла в книге "Совершенный код" (10.3. Принципы инициализации переменных):
0
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
31.01.2016, 12:03 | |||||||
+1 к защите от изменений изнутри функции и в то же время: +1 к синтаксическому мусору: http://rextester.com/JWUX61217
идентичного по факту типа только запутывают. о защите от изменений изнутри функции, он как то не упомянул.
0
|
Неэпический
![]() |
|
31.01.2016, 12:11 | |
hoggy, а теперь вдруг, мы решили переместить объект типа example (назовем его obj) в функции foo.
Простой std::move(obj) уже не прокатит, т.к. врядли в example есть констуктор example(const example&&) Соответственно, придется либо менять тип параметра, убирая const, а это приведет к необходимости изменения клиентского кода, а можно требовать у клиента вышеуказанного конструктора, что тоже крайне убого, либо к снятию const у obj, в данном, случае, это, наверное, самое лучшее решение будет. Но тогда возникает вопрос, на кой черт этот const вообще поставили изначально. То есть он нам тупо может мешать в будущем, Вот я к чему ![]()
0
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
31.01.2016, 12:23 | |||
что бы накорню пресекать подобные действия. строгие гарантии нужны для обеспечения отказоустойчивости системы. но предоставить их может лишь тот функционал, который гарантирует, что в случае каких то поломок, всегда можно откатиться взад. так, словно вызова функции, приведшего к аварии "как бы и не было".
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
31.01.2016, 12:49 | |
Croessmah
Мне кажется, хотя я не уверен, что если указать явно на то, что объект константный, то над ним можно проводить естественные для иммутабельных объектов оптимизации. Например, одну и туже inline функцию foo можно будет использовать как для обработки неволатильных объектов внешнего кода, так и для обработки волатильных объектов. Причём в первом случае компилятор имеет возможность "оптимизировать дорогое копирование", а во втором скопировать объект, в отличие от передачи по ссылке, гарантируя неволотильность объекта внутри foo.
0
|
![]() ![]() 8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
31.01.2016, 13:13 | ||
что впрочем и не удивительно. потому что нет объективных причин передавать крупные объекты по значению. а если понадобится копия - её всегда можно сделать изнутри функции. а для случаев опустошения, которые не имеют легаси с с++03, дизайн специально предусматривает мув-конструкторы, и мув-операторы.
0
|
31.01.2016, 13:13 | |
Помогаю со студенческими работами здесь
20
Передача аргументов в функцию по ссылке и указателю Передача параметров в функцию по значению, по ссылке и по указателю Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
|
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
|
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
|
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
|
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
|
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
|
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
|
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
|
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
|
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C#
Задание 1:
КЛАСС FORM 1
public partial class Form1 : Form
{
Spisok listin = new Spisok();
. . .
|