关于STL内部的问题

时间:2011-04-01 08:55:30

标签: c++ optimization stl io mmap

我目前正在为二进制数据写一些关于IO的抽象。在这一点上,我目前还不确定STL在某些任务上的表现如何。例如,我有很多东西可以将二进制编码为char *或std :: vector。现在每当我有这种字节类型的对象时,我或者只是使用ostream :: write()编写它,或者在数组上对一个ostream_iterater执行std :: copy。现在我想知道,副本将在内部做什么。

据我所知,STL可以优化任何东西。例如,在Theory中,使用std :: copy存储字符的两个向量的副本不应该逐字节地复制这些字符,而是使用系统原语来复制数据块(如果可用)。这是如何在内部完成的。

我问这个的原因是因为我现在正试图将文件切换到mmaped内存而不是std :: ostreams。这意味着,写入char *数据将非常简单,但写入向量将逐字节。我必须在课堂上为STL提供什么来优化复制(可能使用memcpy)?我猜我需要正确的迭代器,但他们需要什么,所以STL会知道它只能记忆而不是走路。

我知道这是要求我通常不应该关心的很多东西(封装原理通常很棒)。当然我知道Knuths优化规则,这就是我关心STL自动优化设施的原因。

3 个答案:

答案 0 :(得分:1)

如果您不确定STL的表现如何,则无法替代测试。 std ::多次复制大量数据所需的时间,以及使用memcopy复制相同数量的数据需要多长时间,并进行比较。

自己做这些测试比担心STL优化更有启发性。

答案 1 :(得分:1)

iostream适用于格式化(即文本)IO 。如果需要二进制IO,则必须使用streambuf类。

此外,iostream的声誉很慢(出于各种原因,你的里程会有所不同)。

Iostreams在内部使用streambuf,它增加了一层间接,并为您提供自动缓冲。如果您需要合理的二进制IO吞吐量,您可能希望直接使用streambuf派生类(如fstreambuf)并对其进行基准测试(并禁用synchronization with stdio)。

或者您可以直接使用mmapwrite。这些函数使用起来非常简单,并且应该很容易在它周围编写自己的类。

哦,不要假设标准库的功能。如果您想了解更多有关内部工作的信息,请查看例如。 GNU实现。

答案 2 :(得分:1)

你所要求的并不是很清楚。你提到了向量,std::copychar*和内存映射文件,但它们之间没有明显的联系。向我们展示一些代码,或描述您正在尝试做什么,以及使用何种数据类型。

但是,STL实现中的常见优化是使用memcpy或类似的原始内存复制机制,只要您要复制的对象类型是POD即可。因此,假设您的STL实现中存在此优化,您所要做的就是确保您要复制的对象是POD类型。

但如前所述,获得有关性能的可靠信息的唯一方法是自行分析/测量/基准测试。