D有没有类似C++11的emplace_back()
的东西?当我将一个或多个结构附加到数组或其他一些在其成员上具有值语义的 D 容器的末尾时,我通常需要这个吗?
更新:我想这就是答案吧?:http://dlang.org/phobos/std_conv.html#.emplace
我仍然认为就 D 对内存有更严格的控制这一事实质疑是否需要 emplace 是相关的 - 在上述情况下,是否可以通过巧妙的编译器优化来消除对 emplace 的需要?
最佳答案
D 的 emplace 需要内存已经提前设置好,主要用于将类放在堆栈上或手动管理内存(内置的 new 总是使用 gc 堆,除非你 hack the 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/