0%

写这篇的背景是当前很多shell都会有git prompt脚本,即对当前git仓库分支、改动情况的提示。
git分支命令的执行通常不会占用太多时间,但是改动情况的命令如git status或者简短版本的git status --porcelain则不然,特别是当仓库项目很大时,当你有以下我的使用场景时则更为糟糕。目前我个人的开发环境是windows+wsl,习惯上我会在win上通过git for windows的版本clone代码,然后在wsl里访问编辑,在这种场景下你会发现在wsl中的git status命令执行时间更长(这里我没深究其原因),特别是当你每敲一行命令shell都会去执行git status就更加恼人。
以下为个人的折腾记录,“可能”会不断更新不同shell的情况:

阅读全文 »

总体结构

variant

首先是variant的结构,variant的模板声明长这样:

1
2
3
4
5
6
7
8
9
10
11
12
template<typename... _Types>
class variant
: private __detail::__variant::_Variant_base<_Types...>,
private _Enable_default_constructor<
__detail::__variant::_Traits<_Types...>::_S_default_ctor,
variant<_Types...>>,
private _Enable_copy_move<
__detail::__variant::_Traits<_Types...>::_S_copy_ctor,
__detail::__variant::_Traits<_Types...>::_S_copy_assign,
__detail::__variant::_Traits<_Types...>::_S_move_ctor,
__detail::__variant::_Traits<_Types...>::_S_move_assign,
variant<_Types...>>

_Enable_copy_move在上一篇optional解析中解释了,这里不同之处在于要考察variant的模板参数包内多个类型的可复制性、可移动性,如果其中某个类型不可复制或不可移动,那么variant亦不可复制或不可移动。
_Enable_default_constructor为用于生成默认构造的helper模板,代码长这样:

阅读全文 »

std::optional是17标准中增加的管理可选值的类模板,以往经验中如果某个函数的返回值可能失败,如何判断这个失败值和传递这个失败值都需要些额外的手段,optional的出现则很好的解决了这个问题。以下是gcc13版本中std::optional源码的个人解析:

std::optional实现内各类型关系

optional

首先是optional模板声明及内部别名:

阅读全文 »

std::string_view 是自17标准引入的轻量级只读字符串视图,用于进一步减少字符串参数传递时的内存拷贝。
string_viewstring类似,同样是一个别名,实际类型为basic_string_view<char>,<string_view>中声明:

阅读全文 »

std::array为11标准中带来的可以替代C风格数组的聚合类型,可以通过聚合初始化生成"C++风格"上的"C风格"数组:

1
std::array<int, 3> a = {1, 2, 3};

主要代码如下:

阅读全文 »