文件到 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_file
的data()
。
【讨论】:
@Raxvan 这些是平台相关的以上是关于文件到 std::string_view的主要内容,如果未能解决你的问题,请参考以下文章
将 std::string_view 返回到 const char * [重复]
将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?