2014-04-10 26 views
5

我正在阅读关于raw_storage_iterator组件的TC++ PL。使用这个组件,我们可以获得性能优势,因为它可以避免分配(更昂贵)并使用复制构造。它在我看来应该在序列/容器中使用,我们可以有大量元素,因此分配调用的次数可以产生很大的影响。什么是raw_storage_iterator组件在C++中的使用/优点

从理论上讲它很清晰,它在我看来这个组件对于容器类型类很有用。不过,我想了解我们应该在哪些地方使用这个组件(通过实际的例子)来获得它的性能优势?

+0

inb4“cplusplus.com很烂,你不敢链接它”;它在那里说,它被使用,所以你可以使用未初始化的内存作为算法的目的地。性能应该不会比使用后端插入器迭代器的保留向量更好。除非你编写非常低级的代码,否则你不需要这个迭代器。 – DanielKO

+0

@DanielKO带有后端插入器迭代器的保留向量必须在每次插入时执行大小检查。确定尺寸检查不需要的编译器相对不太可能。你会在支票上得到很好的分支预测,但它仍然会低于'raw_storage_iterator'的写作。 – Yakk

回答

3

cppreference有示例代码。

您可以通过多种机制分配未初始化内存的对齐块。 Cppreferences使用std::get_temporary_buffer<T>来分配这样一个缓冲区。

然后你可以制作一个指向这些元素的指针。指针的类型有点令人误解,因为它不是指向有效的指针,而是指向适合于构建T的内存块。

std::raw_storage_iterator可填充该T*并告诉输出到它。然后,您可以将该迭代器提供给期望传统输出迭代器的算法,并且顺利进行。

如果您试图在没有raw_storage_iterator的情况下执行此操作,您将分配给未构造的T,这是未定义的行为。作为替代方案,您可以在输出给它们之前构造T - 但这是浪费的,因为它会构造对象两次。

其基本思想是允许在标准算法中使用近乎完美的未初始化输出缓冲区。除了一些严重的代码微优化之外,这不是您应该使用的。

+0

难道这不是一个很好的地方使用安置新的替代呢? 这将使构造的对象一次进入保留空间。这仍然需要程序员获得足够的空间,但它似乎可能更好的性能和安全性。 – Paul

+0

@paul这个迭代器确实使用放置'new',只是它分配给它时才做它。原始存储迭代器允许您将其作为'std'某个算法的输出 - 其中一些算法可能不想手动滚动。 – Yakk

相关问题