c++ - 如何在 C++17 中不包含完整文件系统头的情况下使用文件系统的类路径?

标签 c++ performance boost filesystems

我有两个问题:

第一个问题:

我想创建一个类型的对象

std :: filesystem :: path

我希望在不通过 boost 的情况下执行此操作,因为标准 C 17 允许这样做。

boost 的优势在于我们可以做到:

#include <boost / filesystem / path.hpp>

因此它允许您准确地包含您想要的内容。

但如果我一开始就这样做:

#include <filesystem>

那么在这种情况下,它在处理后的代码中包含了很大一部分不会被使用的代码(但我不确定这种说法)。

那么,我的第一个问题:是否可以仅包含 C++17 标准的文件系统类“路径”?

我看了:

https://en.cppreference.com/w/cpp/header/filesystem

还有很多我不需要的类(class)。我只需要“路径”。

如何在不涉及boost的情况下只集成路径?

我想,万一有可能,在 C 17 中使用 if 文件系统会减少预处理后获得的代码?

谢谢

最佳答案

标准要求 path至少在 <filesystem> 中向前声明,参见:29.11.5 Header <filesystem> synopsis .实际上,这取决于您的编译器在哪里 std::filesystem::path已声明,因此,您应该只包含 <filesystem> .

我也觉得只需要包括 <boost/filesystem/path.hpp>就编译时间而言,比必须包含“全部”<fileysystem> 更便宜,但测量它给出了令人惊讶的结果,至少在我的机器上,std::filesystem :

$ echo '#include <filesystem>' | time -p g++ -std=c++17 -x c++ -c -
real 0.49
user 0.43
sys 0.05

与仅包括 <boost/filesystem/path.hpp> 相比:

$ echo '#include <boost/filesystem/path.hpp>' | time -p g++ -std=c++17 -x c++ -c -
real 0.89
user 0.81
sys 0.07

所以包括<filesystem>几乎是包含“仅”<boost/filesystem/path.hpp> 的两倍.为了进一步证实编译时间的增加可以归因于 Boost 实现而不是其他一些晦涩的原因,我检查了由于包含 <boost/filesystem/path.hpp> 而需要预处理的头文件的数量。和 <filesystem>分别是:

$ echo '#include <boost/filesystem/path.hpp>' | g++ -std=c++17 -x c++ -M -c - | wc -l
407

对比:

$ echo '#include <filesystem>' | g++ -std=c++17 -x c++ -M -c - | wc -l
144

我认为可以安全地得出结论,您不必担心包含 <filesystem>如果是您担心的编译时间。

关于c++ - 如何在 C++17 中不包含完整文件系统头的情况下使用文件系统的类路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428356/

相关文章:

c++ - 如何连接曲线的两部分并获得连接曲线的点位置?

水库采样的性能与获取列表长度和选择随机元素的比较

ubuntu - 为什么在 GNU/Linux 上停止(或重新启动)squid3 如此缓慢?

C++ STL链表

c++ - Linux:无法读取Windows上编写的二进制文件

c++ - 为编程语言 : Output 编写解析器

c++ - Armadillo的cx_mat和Boost的odeint编译报错

php - MySQL/PHP 搜索效率

c++ - Boost echo 服务器示例并在 lambda 中捕获 this 和 shared_from_this()

c++ - 使用 Boost.Polygon 对曼哈顿多边形进行切片