Robotics Library项目代码分析(3)项目的std一栏

RL的src/rl/std解读

前言

在上一次分析源码中,我们先看了cmakefile文件,从这一行

set(RL_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/rl/std)

我们得知rl先从这里进行编译,那么我们来仔细看看这里到底说的什么

开始

rl的std下分为这几个文件,分别是:chrono、condition_variable、future、iterator、mutex、random、regex、string、thread以及一个cmakelists文件。
编写这些文件的原因是这个项目采用的标准可以支持到cpp的0x标准、而有些特性项目采用了,但是不在c++标准中,而且又由于它们都属于未来的cpp标准的文件,所有采用这种方式将这些文件导入,算是一种折中的办法。

chrono

这个代码比较简单,我们直接看全部的源码:

#ifndef RL_STD_CHRONO
#define RL_STD_CHRONO

#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918
#include <../include/chrono>
#elif defined(_MSC_VER)
#include <boost/chrono.hpp>

namespace std
{
 namespace chrono = ::boost::chrono;
}
#else // _MSC_VER
#include_next <chrono>

#if __GNUC__ == 4 && __GNUC_MINOR__ < 7 && !__clang__
namespace std
{
 namespace chrono
 {
  typedef monotonic_clock steady_clock;
 }
}
#endif // __GNUC__
#endif // _MSC_VER

#endif // RL_STD_CHRONO

总的来说就是如果采用的是msvc编译器,则判断msvc编译器是否到了190023918版本,然后如果到了直接使用std的这个头文件,否则就使用boost的这个chrono头文件,下面的else则是一样的,如果不是msvc编译器,也不是clang编译器,并且gcc的编译器版本在gcc4和gcc7之间则使用将monotonic_clock定义为steady_clock,可能是因为这时候这个特性没有实现。

condition_varianle

这里也是一样的,检测是否有msvc编译器和其版本,然后判断是有这个头文件,没有则使用boost的头文件。这个头文件主要是是与std::mutex一起使用的同步语句,可以用来用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 std::condition_variable,就是一个条件堵塞时候用的。

namespace std
{
 using ::boost::condition_variable;
 
 using ::boost::condition_variable_any;
 
 using ::boost::cv_status;
 
 using ::boost::notify_all_at_thread_exit;
}

我们主要看一下核心的部分,主要是用到了四种条件变量的特性。这些特性均在c++11中实现完成了。所有我们不需要过多在意。

future

这里的future也是一样的,但是future在c++20中得到了加强。

  1. std::jthread 支持:C++20 引入了 std::jthread,它是一个更高级的线程类,能够自动管理线程的生命周期。这使得与 std::future 结合使用时,线程管理变得更加简单。

  2. std::stop_tokenstd::stop_source:C++20 引入了 std::stop_tokenstd::stop_source,用于更优雅地停止异步操作。这些新特性可以与 std::future 结合使用,以便在需要时安全地停止异步任务。

  3. 改进的异常处理:C++20 对异常处理进行了改进,使得在异步操作中捕获和处理异常更加方便和可靠。

  4. std::shared_future:虽然 std::shared_future 在 C++11 中已经存在,但 C++20 对其进行了改进,使其在多线程环境下的性能和安全性更高。

regex

正则表达式是一个非常比较有意思的库,在std中的regex性能比较低,甚至其慢到比很多脚本语言执行的regex慢很多倍,甚至可能有非常大的性能差距,直到今天还是有很大的问题,所有我们最好采用别的regex库,


#if (defined(_MSC_VER) && _MSC_VER < 1600) || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)
#include_next <boost/regex.hpp>

namespace std
{
 using ::boost::basic_regex;
 
 using ::boost::cmatch;
 
 using ::boost::csub_match;
 
 using ::boost::match_results;
 
 using ::boost::regex;
 
 using ::boost::regex_match;
 
 using ::boost::regex_search;
 
 using ::boost::regex_replace;
 
 using ::boost::smatch;
 
 using ::boost::sub_match;
 
 using ::boost::ssub_match;
 
 using ::boost::wcmatch;
 
 using ::boost::wcsub_match;
 
 using ::boost::wregex;
 
 using ::boost::wsmatch;

 using ::boost::wssub_match;
}

如果编译器是 Microsoft Visual C++ (MSC_VER) 版本小于 1600,或者是 GNU 编译器 (GCC) 版本 4 且小版本小于 9,那么就包含 boost/regex.hpp 头文件。

然后在 std 命名空间中,使用 boost 命名空间中的正则表达式相关类和函数。其他的话就采用std本身的regex,之后我们进行代码修改时候应该将std的库改成boost的。

其他库

其他库和上面一样,就是判断是否编译器支持c++11,然后就导入标准库,否则就使用boost里面的库。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值