Читая исходный код стандартной библиотеки, я обнаружил очень редкое использование указателей для параметров функции, даже с const
, если только этот конкретный параметр не редактируется функцией. С моей точки зрения, это не кажется очень эффективным, поскольку вы делаете полную копию аргумента (очевидно, неглубокую копию). Так почему же это? Это лучше, чем передавать что-то как постоянный указатель, или это просто «идиоматический зигзагообразный путь»?
Большое спасибо.
TL;DR, если он передается по значению, компилятор Zig все равно может решить передать его по ссылке под капотом.
из документации:
Примитивные типы, такие как целые числа и числа с плавающей запятой, передаваемые в качестве параметров, скопировано, а затем копия доступна в теле функции. Это называется «передачей по значению». Копирование примитивного типа по сути бесплатно и обычно не включает в себя ничего, кроме настройки реестра.
Структуры, объединения и массивы иногда могут передаваться более эффективно. в качестве ссылки, поскольку копия может стоить сколь угодно дорого в зависимости от по размеру. Когда эти типы передаются в качестве параметров, Zig может выбрать копировать и передавать по значению или передавать по ссылке, в зависимости от того, каким способом Зиг решит, будет быстрее. Частично это становится возможным благодаря тому, что эти параметры неизменяемы.
Вы по-прежнему можете явно передавать по ссылке, а иногда это даже необходимо для предотвращения неопределенного поведения - например, в методе структуры вы можете захотеть получить доступ к данным экземпляра этой структуры, а не к ее временной копии, которую вы могли бы получить при проходе. -по значению. Это может стать ловушкой, если ваш метод возвращает указатель.
Таким образом, передавая значение по значению, Зиг может передать его по ссылке, но верно ли и обратное? То есть, если он явно передается по ссылке, может ли Зиг передать его по значению? Наконец, что вы порекомендуете как (я полагаю) частый пользователь Zig: функцию, принимающую параметры в качестве значений или в качестве ссылки (очевидно, если этот параметр не редактируется внутри функции, иначе ссылка будет по существу обязательной)?
@kupper верно и обратное? - Думаю, нет. Как уже отмечалось, в некоторых случаях необходимо передать ссылку, иначе кодируемая вами функциональность не будет работать. Компилятор должен это учитывать. Что касается того, что я бы использовал, я думаю, что в основном следую стандартной библиотеке и не буду явно указывать передачу по ссылке, если в этом нет необходимости. Как и вы, я читаю кучу кода и смотрю, что делают другие... Вам может стоить нервов, чтобы выяснить, что требует передачи по ссылке, но значение по умолчанию (пусть решает компилятор) позволяет избежать ошибок из-за изменчивости кода. данные, на которые вы ссылаетесь (указываете).
Да, кажется, лучший вариант. Спасибо.
Если вы хотите углубиться, вот разговор по этой теме. На данный момент (Zig не 1.0...), похоже, нужно внимательно следить за тем, что может сделать компилятор из-за оптимизации ссылок на параметры.