Почему в стандартной библиотеке Zig очень мало указателей в качестве параметров?

Читая исходный код стандартной библиотеки, я обнаружил очень редкое использование указателей для параметров функции, даже с const, если только этот конкретный параметр не редактируется функцией. С моей точки зрения, это не кажется очень эффективным, поскольку вы делаете полную копию аргумента (очевидно, неглубокую копию). Так почему же это? Это лучше, чем передавать что-то как постоянный указатель, или это просто «идиоматический зигзагообразный путь»?

Большое спасибо.

Если вы хотите углубиться, вот разговор по этой теме. На данный момент (Zig не 1.0...), похоже, нужно внимательно следить за тем, что может сделать компилятор из-за оптимизации ссылок на параметры.

FObersteiner 11.07.2024 18:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TL;DR, если он передается по значению, компилятор Zig все равно может решить передать его по ссылке под капотом.

из документации:

Примитивные типы, такие как целые числа и числа с плавающей запятой, передаваемые в качестве параметров, скопировано, а затем копия доступна в теле функции. Это называется «передачей по значению». Копирование примитивного типа по сути бесплатно и обычно не включает в себя ничего, кроме настройки реестра.

Структуры, объединения и массивы иногда могут передаваться более эффективно. в качестве ссылки, поскольку копия может стоить сколь угодно дорого в зависимости от по размеру. Когда эти типы передаются в качестве параметров, Zig может выбрать копировать и передавать по значению или передавать по ссылке, в зависимости от того, каким способом Зиг решит, будет быстрее. Частично это становится возможным благодаря тому, что эти параметры неизменяемы.

Вы по-прежнему можете явно передавать по ссылке, а иногда это даже необходимо для предотвращения неопределенного поведения - например, в методе структуры вы можете захотеть получить доступ к данным экземпляра этой структуры, а не к ее временной копии, которую вы могли бы получить при проходе. -по значению. Это может стать ловушкой, если ваш метод возвращает указатель.

Таким образом, передавая значение по значению, Зиг может передать его по ссылке, но верно ли и обратное? То есть, если он явно передается по ссылке, может ли Зиг передать его по значению? Наконец, что вы порекомендуете как (я полагаю) частый пользователь Zig: функцию, принимающую параметры в качестве значений или в качестве ссылки (очевидно, если этот параметр не редактируется внутри функции, иначе ссылка будет по существу обязательной)?

kupper 07.07.2024 15:47

@kupper верно и обратное? - Думаю, нет. Как уже отмечалось, в некоторых случаях необходимо передать ссылку, иначе кодируемая вами функциональность не будет работать. Компилятор должен это учитывать. Что касается того, что я бы использовал, я думаю, что в основном следую стандартной библиотеке и не буду явно указывать передачу по ссылке, если в этом нет необходимости. Как и вы, я читаю кучу кода и смотрю, что делают другие... Вам может стоить нервов, чтобы выяснить, что требует передачи по ссылке, но значение по умолчанию (пусть решает компилятор) позволяет избежать ошибок из-за изменчивости кода. данные, на которые вы ссылаетесь (указываете).

FObersteiner 07.07.2024 18:21

Да, кажется, лучший вариант. Спасибо.

kupper 08.07.2024 12:14

Другие вопросы по теме