c++11 - 安置在D

标签 c++11 d perfect-forwarding emplace

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/

相关文章:

c++ - 为集合中的每个元素调用带有多个参数的函数

header - 确定 D 中的 CPU 架构

compiler-errors - 错误: module `string` is in file 'std/c/string.d' which cannot be read

C++:在基对象列表中,派生内存在通过引用传递时会产生意想不到的结果

c++ - 通用引用参数使用了两次

C++11 实现移动构造函数并移动成员 vector

c++14 - vec.begin() 和 begin(vec) 之间有什么区别

c++ - 如何使用 shared_ptr 避免悬挂指针?

int - 检测整数溢出

c++ - 为什么通用引用不适用于数组?