Параметры функции: ключевое слово «ref» или указатели в D? - PullRequest
0 голосов
/ 25 августа 2018

В настоящее время я изучаю D и вижу, что он позволяет определять указатели почти так же, как в C ++, однако он также позволяет передавать по ссылке через ключевое слово ref. Что касается параметров функции, у меня есть следующие вопросы:

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

  2. Существуют ли случаи, когда использование указателей, а не ключевого слова ref в функциях, значительно выгоднее, даже если ответ на вопрос 1 - "да"?

Например, следующие два кода дают идентичные результаты. Является ли одно лучше другого, кроме того, что удобнее использовать ключевое слово "ref"?

Код 1 (используются указатели):

import std.stdio;

struct X {
    int s;
    int y;
}

pure void my_func(X *x) {
    x.s = 10;
    x.y = 90;
}

void main() {
   X cat = X(1,2);
   X *cat_ptr = &cat;
   writeln(cat.y);
   my_func(cat_ptr);
   writeln(cat.y);
}

Код 2 (используется ключевое слово ref):

import std.stdio;

struct X {
    int s;
    int y;
}

pure void my_func(ref X x) {
    x.s = 10;
    x.y = 90;
}

void main() {
   X cat = X(1,2);
   writeln(cat.y);
   my_func(cat);
   writeln(cat.y);
}

Я в основном из Java, поэтому мое понимание этих понятий невелико.

1 Ответ

0 голосов
/ 26 августа 2018

Я редко вижу необработанный указатель в D. Для массивов вы используете срезы (например, int[]).Чтобы передать что-либо по ссылке, вы объявляете это как ref параметр.Вы используете классы там, где они подходят, и есть RefCounted, который по сути является интеллектуальным указателем.

Вероятно, наиболее распространенной заменой указателей в D являются фрагменты (и указатель может во многихпути считаются срезом, который содержит либо ноль, либо один элемент).То есть, если вы не учитываете this, который также по сути является указателем.

Срезы D - это просто тонкие обертки вокруг указателей, так что вы можете в основном делать с ними точно такие же вещи, но обычныеоперации безопаснее с ломтиками.Компромисс заключается в том, что он немного медленнее, так как доступ к элементу проверяется по диапазону.

Поскольку вы говорите, что пришли из Java-фона, я добавлю, что вы можете написать почти такой же код на D,и он скомпилируется и запустится, и будет делать то же самое, что и в Java.Это не будет идиоматический D, но он будет работать.

Обновление, поскольку вопрос изменился:

В примере кода нет причин использовать указатели вместо refпараметры - он должен компилироваться с точно таким же машинным кодом.Как правило, указатели следует использовать только тогда, когда вы собираетесь выполнять арифметику указателей.Если вы не уверены, что собираетесь, просто предположите, что не будете.

...