D的进驻

时间:2013-09-16 20:10:16

标签: c++11 d perfect-forwarding emplace

D有类似于C ++ 11的emplace_back()吗?当我将一个或多个结构附加到数组的末尾或其成员的其他D容器上时,我通常想要这个吗?

更新:我想这是正确答案?:http://dlang.org/phobos/std_conv.html#.emplace

我仍然认为有必要质疑D对更严格控制内存这一事实的必要性 - 在上面提到的情况下,是否可以通过聪明的编译器优化来满足对emplace的需求?

1 个答案:

答案 0 :(得分:3)

D's emplace需要提前设置内存,主要用于将类放在堆栈或手动管理的内存中(内置的new总是使用gc堆,除非你破解了druntime)

emplace_back也附加了。所以为了得到它的作用,你首先要附加一个元素,然后将它置于其中。但是因为D的课程总是被引用,所以如果没有一些关心,这将无法真正起作用。

如果要将结构附加到数组,那就可以正常工作,我不确定它是否复制。编译器当然可以优化它:

struct A {}
A[] arr;
arr ~= A(); // this puts the new one at the end of the array, and might optimize away the copy

将一个类附加到数组会更棘手。你想要单独做这些事情:

ubyte[] arr;
C[] references;

arr.length = arr.length + __traits(classInstanceSize, C);
references ~= emplace!(C)(arr[$ - __traits(classInstanceSize, C) .. $], ctor args...);

或类似的东西。如果您通过值大量使用对象,或者需要更精确地控制内存,则应该考虑使用结构。如果可能的话,会更容易。