Распределение класса D в стеке - PullRequest
0 голосов
/ 27 декабря 2018

https://dlang.org/spec/expression.html говорит: «Если выражение NewExpression используется в качестве инициализатора для локальной переменной функции с классом хранения области, а аргумент ArgumentList для new пуст, то экземпляр размещается в стеке, а не в куче илииспользуя специфичный для класса распределитель. "

Означает ли это, что в следующей программе объект C размещается целиком в стеке, без выделения кучи?

class C {
  int x;
}

void main() {
  scope c = new C();
}

Также:Почему это работает только для пустого списка аргументов?

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

1 Ответ

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

В D классы обычно располагаются в куче.В этом конкретном случае классы могут быть размещены в стеке.

Особый случай:

  • Переменная инициализируется вызовом new SomeClass
  • Никакие ссылки на это значение не экранируют текущую функцию (scope)
  • Инициализация не включает пользовательский распределитель (который устарел);это было бы похоже на new(args) SomeClass.
...