RAI в D для структур, избегая дорогостоящего копирования - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в языке программирования D.Я собираюсь написать несколько привязок библиотеки C на D. Итак, этот вопрос.

Предположим, у нас есть структура S (не класс!)

Предположим, что все перечисленное дорогооперации:

  • S инициализация (конструктор);
  • S финализация (деструктор);
  • S постблит.

Теперь я хочу передать S значения следующим образом:

S func(const ref S x) {
    return S(x);
}

Вопрос: Произойдет ли чрезмерное (более чем минимально, чтобы выразить мой алгоритм) использование вышеупомянутых дорогостоящих операций?Если да, как это предотвратить?

Обратите внимание, что я использую struct, а не class из практических соображений производительности.

1 Ответ

0 голосов
/ 29 декабря 2018

Следующая программа показывает, что происходит избыточное копирование:

$ ./init_test 
Initialization
Postblit
Finalization
Finalization

Текст программы:

import std.stdio;

struct Expensive {
    static create() {
        writeln("Initialization");
        return Expensive.init;
    }
    ~this() {
        writeln("Finalization");
    }
    this(this) {
        writeln("Postblit");
    }
}

Expensive func(const Expensive x) { // `ref const` results in compilation error
    return x;
}

void main() {
    Expensive obj = func(Expensive.create());
}
...