3

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

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

我仍然认为它与质疑 emplace 的需求有关,因为 D 对内存有更严格的控制 - 在上面提到的情况下,是否可以通过巧妙的编译器优化来淘汰对 emplace 的需求?

4

1 回答 1

3

D 的 emplace 需要提前设置好内存,主要用于将类放在堆栈上或手动管理内存(内置的 new 总是使用 gc 堆,除非你破解了运行时)。

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

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

于 2013-09-16T22:11:04.187 回答