D是否具有类似于C++ 11的emplace_back()的内容?当我将单个或多个结构追加到数组或在其成员上具有值语义的其他D容器的末尾时,通常需要这样做?

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

对于D对内存有更严格控制的事实,我仍然认为这与质疑是否需要Emplace有关-在上述情况下,能否通过巧妙的编译器优化来消除对Emplace的需求?

最佳答案

D的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...);

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

关于c++11 - D的安置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18836458/

10-10 18:44