文件到 std::string_view

Posted

技术标签:

【中文标题】文件到 std::string_view【英文标题】:File to std::string_view 【发布时间】:2019-11-04 16:14:57 【问题描述】:

是否可以将文件直接加载到 std::string_view 中?

直接 = 不从 stringstream 创建代理 std::string。

这会让我的很多代码更快。

【问题讨论】:

可能没有你想的那么快。从文件中读取是 sssssloooowwww,如果你必须这样做,你就必须这样做。不确定您需要stringstream 做什么。为此添加代码,或提出其他问题,很有可能有人可以帮您解决它。 显示您想要加速的代码,然后您将收到如何正确实现此目标的反馈。 我不能,因为它还不存在。我听说 substr 方法工作得更快,我想在只读的 CSV 文件中使用它。 您可能可以使用mmap (linux) 或virutal mapping (win32) docs.microsoft.com/en-us/windows/win32/memory/file-mapping 将文件映射到内存中 【参考方案1】:

如果我明白你在问什么,不。

std::string_view 指的是内存区域,但 它并不拥有该内存。 这意味着 std::string_view 要求存在另一个实际持有的对象char 它所引用的对象。

如果std::string_view 引用std::string 并且该字符串的生命周期结束,那么std::string_view 现在实际上是一个悬空引用/指针,尝试从中读取字符会导致未定义的行为。

请注意,std::string_view 可以引用 char 对象的连续序列,而不是 std::string,例如简单的 char 数组或 std::vector<char>,但不管它指的是什么,所指对象 必须至少在使用std::string_view 期间存在。

【讨论】:

谢谢!我认为字符串是代表文件的字节数组。 @JWZ1996 请注意,如果您 mmap() 文件,则可以直接针对内存映射区域构造 std::string_view,如另一个答案中所示。 (Boost 不是必需的,但会为 mmap 资源提供适当的 RAII。) @cdhowie 我没有 :),我删除了它。【参考方案2】:

如果您有权访问boost,则可以将字符串视图指向boost::iostreams::mapped_filedata()

【讨论】:

@Raxvan 这些是平台相关的

以上是关于文件到 std::string_view的主要内容,如果未能解决你的问题,请参考以下文章

将 std::string_view 返回到 const char * [重复]

将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?

std::string_view 编译时散列

为啥 std::string_view 不是微不足道的?

除了 std::string_view 方法之外,std::string_view 比 char* 有啥优势吗?

如何将 boost::string_view 转换为 std::string_view?