【问题标题】:File to std::string_view文件到 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 将文件映射到内存中

标签: c++ stl string-view


【解决方案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 这些是平台相关的
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多