gpt4 book ai didi

c++ - 关于STL内部结构的问题

转载 作者:太空狗 更新时间:2023-10-29 21:29:08 25 4
gpt4 key购买 nike

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

据我所知,STL 可以优化任何东西。例如,在理论上,使用 std::copy 存储字符的两个 vector 的拷贝不应逐字节缓慢地复制这些字符,而应使用系统原语来复制数据 block (如果可用)。这是如何在内部完成的。

我问这个的原因是因为我现在正试图将文件切换到映射内存而不是 std::ostreams。这意味着,写入 char* 数据将非常简单,但写入 vector 将是一个字节一个字节地进行。我必须在类里面为 STL 提供什么来优化复制(可能使用 memcpy)?我猜我需要正确类型的迭代器,但它们需要什么,这样 STL 就会知道它可以只进行 memcopy 而不是遍历它们。

我知道这会问很多我通常不应该关心的问题(封装原则通常是一件好事)。我当然知道 Knuths 优化规则,这就是为什么我关心 STL 的自动优化工具。

最佳答案

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

此外,iostream 以速度慢着称(出于各种原因,您的里程会有所不同)。

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

或者你可以直接使用mmap或者write。这些函数使用起来非常简单,围绕它编写自己的类应该很容易。

哦,不要对标准库的功能做出任何假设。如果您想了解更多关于它内部如何做事的信息,请查看 eg 的来源。 GNU 实现。

关于c++ - 关于STL内部结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5511158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com