то в курсах так и говорилось: "можно передавать по ссылке т.к. мы не копируем и это быстрее". Я так и делал, ок.
Потом я стал писать на Го. Там строки это ссылочный тип. При копировании передается только указатель на строку и длина строки, поэтому передавать по ссылке стало практически бессмысленно.
Дальше, я прочитал совершенный код Макконела, где он говорит, что аргументы функции, которые передаются по ссылке вводят в заблуждение т.к. вызывающему неясно, мутируем ли мы строку внутри или нет, поэтому лучше передавайте по копии.
И дальше цитата Кнута: premature optimization is the root of all evil. То есть в большинстве приложений нет проблем производительности и оптимизации на наносекунды имеют немного смысла. Да и в целом, это место может вполне быть не самым узким.
Собственно, учитывая всё выше, имеем некий компромисс. С одной стороны "скорость" в наносекундах, с другой "чистый код".
Что вы выберите и почему? Может для вас такая "чистота кода" не является ей и т.д.
>> т.к. вызывающему неясно, мутируем ли мы строку внутри или нет, поэтому лучше передавайте по копии. В C++ существует ключевое слово const, позволяющее однозначно понять намерение функции касательно своих аргументов >> premature optimization is the root of all evil В приёме "по ссылке" vs "по значению" есть разница в семантике операции, поэтому в C++ принято заранее учитывать такие тонкости в дизайне интерфейса функции. Не потому что мы оптимизируем что-то, а потому что смысл разный
Про const знаю, но читая код его не видно в самом коде (ide подскажет, да, но всё же). »принято заранее учитывать что имеете в виду?
А копию, стало быть, вы увидите там?
В том плане, что интерфейс предполагается использовать определённым образом. Фактически, создавая определённый интерфейс, программист создаёт контракт с пользователем. И за его нарушение можно поплатиться даже
Ссылки — это то, что обычно расставляется в коде "на автомате". Потому что операция копирования может внести непредсказуемые изменения — вплоть до смены смысла кода. И вопрос производительности — лишь один из частных примеров. Поэтому любой рядовой программист вынужден думать, хочет он в качестве аргумента иметь непосредственно его (в виде ссылки) или нечто иное, полученное в ходе операции копирования
ну в плане max(a, b) - копия max(&a, &b) - ссылка. Вы уверены, глядя на эти строки, что функция max внутри не делает a+=42 ?
В плане вы несколько плохо знаете язык. Второе не ссылки
Обсуждают сегодня