Перемещение объектов в heap

Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в changelog к старой (на данный момент) версии компилятора.

Шаблон moveToHeap принимает некий объект, извлекает указатель на него, производит выделение памяти с помощью GC.malloc и  moveEmplace (который лежит в std.algorithm) осуществляет перемещение данных из одного участка памяти в другой. С помощью взятия и распечатки указателей на объект до и после перемещения убеждаемся, что указывают они на разные участки памяти (указатель — это адрес, распечатав адреса видим что они разные).

Таким образом отпадает необходимость инициализировать и уничтожать значение перед переходом в неинициализированные данные.

import std.stdio;
import std.algorithm;

class Example
{
	this(){}
}

T* moveToHeap(T)(ref T value)
{
	import core.memory : GC;

	auto ptr = cast(T*)GC.malloc(T.sizeof);
	// move value and emplace it into ptr
	moveEmplace(value, *ptr);
	return ptr;
}

void main()
{
	auto c = new Example;
	auto p = moveToHeap(c);
	writefln("%0.16x",&c);
	writefln("%0.16x", p);
}

Добавить комментарий