C++ Tips
https://abseil.io/tips/¶
StringView¶
用法¶
| C++ | |
|---|---|
tips:
- const stringView 中的const只是修饰stringView指向buffer的指针可不可以变化,stringview始终不能改变buffer的内容。
- Adding string_view into an existing codebase is not always the right answer: changing parameters to pass by string_view can be inefficient if those are then passed to a function requiring a std::string or a NUL-terminated const char*. It is best to adopt string_view starting at the utility code and working upward, or with complete consistency when starting a new project.
使用StringView的好处:作为函数参数,可以减少数据拷贝和strlen()函数的调用。
源码¶
成员变量¶
保存了一个指针和长度,并不持有string的内存。构造函数的一个小技巧¶
| C++ | |
|---|---|
Str Len计算¶
根据宏定义条件判断,选择不同的计算方法,进行优化。
find函数优化¶
根据查找字符的长度,如果长度==1,直接查找,不等于1,通过LookupTable进行索引,快速查找。
operator和strCat¶
| C++ | |
|---|---|
| C++ | |
|---|---|
absl StrSplit¶
RVO 返回值优化¶
所有现代C++编译器都默认执行RVO,即使在调试构建中也是如此,即使是对于非内联函数也是如此。 编译器会进行RVO的情况:
不会RVO的情况:
-
1、调用函数使用一个已经存在的变量接收返回值
-
2、被调用函数有多个返回值变量
但是,如果返回值是一个变量,在多个地方返回,也会进行RVO。例如:C++ 不声明变量,返回临时变量,RVO也起作用。C++ C++
absl Substitute¶
| C++ | |
|---|---|
absl Status,强制调用者处理错误¶
以上函数使用absl Status作为函数的返回值,会强制函数调用者(caller)对错误进行处理,否则编译出错。| C++ | |
|---|---|
std invoke¶
从 C++17 起,C++提供了std::invoke<>()[1]来统一所有的 callback 形式
- Function
- Function Ptr
- lamda
- Functor
- Member Func
https://www.zhihu.com/column/c_1306966457508118528
函数模版不能偏特化¶
在类模板中,类模板函数只有在被调用时才会被instantiate。¶
模板元编程例子¶
https://github1s.com/abseil/abseil-cpp/blob/HEAD/absl/base/internal/invoke.h invoke的实现,采用了模板元编程,通过SFINCE原理进行匹配,匹配函数和参数的类型然后执行不同的invoke方法。 void_t结合SFINAE技术进行类型选择推断与编译期表达式合法性检测 https://zhuanlan.zhihu.com/p/377561143