c++20—协程
协程简介
协程是一个能在执行过程中被挂起、随后又能恢复执行的函数。
c++20中使用的是无栈协程,对协程的定义为:一个函数如果包含co_await、co_yield和co_return三个关键字中的任意一个,则被称为协程。
co_await关键字
co_await是一个一元操作符,后面跟一个表达式expr,能挂起一个协程并将控制权返回给调用方。这里的expr需要返回一个awaitable对象,awaitable对象内部定制了当前协程是否需要挂起等操作。
awaitable对象
定义一个awaitable对象,主要需要实现三个函数:
await_ready(): 在被co_await时是否已经准备好了,如果返回false,那么co_await awaitable就会立即暂停该协程,然后调用awaitable.await_suspend()。如果返回true,说明数据已经准备好了,那么就会继续执行该协程。
await_suspend():协程被挂起,该函数就会被调用。该函数返回void或true,协程挂起,将控制权交给调用者;如果返回false,则会立即恢复该协程;如果返回其他协程句柄, ...
shell学习—常用组合命令
1 获取日期
time=$(date +%y%m%d)
2 获取脚本当前路径
CUR_DIR=$(cd $(dirname $0); pwd)
3 根据进程名获取进程id
pid=$(ps -ef | grep v2ray | grep -v grep | awk '{print $2}')
4 统计进程某些信息
top -d 10 -p pid -b > test.log &cat test.log | grep pid | awk '{print $10}'
c++17—特性初览
c17特性初览
structed bindings
结构化绑定,将指定的名称绑定到初始化对象的子对象or元素,能绑定数组对象、类似元组的类型、成员变量。
inline variable
内联变量,能直接在头文件中对static变量进行初始化。
class Test {public: inline static int a = 10;};
fold expression
折叠表达式: 一元右折叠、一元左折叠、二元右折叠、二元左折叠
charconv
新增两个字符串转换函数: std::to_chars(), std::from_chars()
std::variant
std::variant,是一个可以存储多种不同类型值但一次只能存储一种类型值的模板类,它类似于一个union类型,但是更加安全和易于使用。在错误的情况下variant不持有任何值。
#include <iostream>#include <variant>int main() { std::variant<int, std::string> x ...
摄影基础—测光模式
测光模式
测光模式的使用前提:
光圈优先模式:快门速度自动
快门优先模式:光圈自动
半自动模式:光圈和快门固定,iso自动
测光模式:
平均测光(全局测光)
多重测光(全局测光)
中央重点测光(局部测光)
点测光(单点测光)
平均测光:对画面中的所有内容进行测光,获得一个测光的平均值。
适合城市街景、连续抓拍、高速运动、大光比环境
多重测光:对画面中的所有内容进行测光,主要先参考对焦点及附件的曝光。
大多数复杂场景、城市风光、阴天的街景、自然风光、延时摄影
中央重点测光:主要对画面中央的部分进行测光,也会参考整个画面的曝光。
中间亮的环境、人像写真、建筑特写、拍摄对象在中间
点测光:只对对焦点部分进行测光。
只想保留高光部分、只想保留浅色部分、黑白或深浅非常分明的颜色、亮与暗非常分明的光线环境
拍摄逆光剪影、拍摄月亮/日落太阳
c++11—function
c++11:std::function
introduce
头文件
#include <functional>
类模板声明
template< class R, class... Args >class function<R(Args...)>;
类模板std::function是通用的多态函数包装器。std::function的实例能存储、拷贝并调用任何可复制构造的可调用目标—函数,例如lambda表达式,bind表达式,或其他函数对象,以及成员函数指针和指向成员数据的指针。
函数绑定
绑定普通函数
void print(int&);std::function<void(int&)> f = print
绑定lambda
std::function<void()> f = []{ std::cout << "stored lambda" };
绑定bind返回的结果
void print(int);...std::function<void()> ...
shell学习—进程处理
ps
ps默认情况下只会显示运行在当前控制台下的属于当前用户的进程。使用格式如下:
ps [option]
几个常用参数:
-a 显示除控制进程和无终端进程外的所有进程
-e 显示所有进程
-f 显示完整的输出格式
如果我们想查找所有的进程组合:
ps -ef
通过进程名查找进程pid:
ps -ef | grep name | grep -v grep | awk ‘{print $2}’
top
top命令和ps命令相似,能实时显示进程信息。使用格式如下:
ps [option]
几个常用的参数:
-d 指定两次屏幕信息刷新的时间间隔,单位为秒
-p 指定监听进程的pid
-b 以批处理的模式运行,直接将结果输出到文件
最简单的使用方式,默认每隔3s刷新屏幕:
top
显示信息如上图,Load average表示平均负载,3个值分别代表最近1min、最近5min和最近15min的负载,值越大说明系统负载越高。如果近15min内的平均负载都很高,说明系统可能有问题。
第二行表示有多少进程处于运行、休眠、停止或僵尸状态。
默认情况下top命令在启动时按照% ...
c++11—引用类型
万能引用
左值和右值
std::move&std::forward
之前也写过std::move&std::forward相关的文章,也是写完后好久没看过了,最近学习模板的相关知识,发现以前的文章理解比较浅薄且存在问题,在此重新进行分析。
std::forward
表示完美转发,能将万能引用的形参进行完美转发。
直接上样例:
#include <iostream>#include <type_traits>template<class T>constexpr T&& Forward(std::remove_reference_t<T>& arg) noexcept { std::cout << "&" << std::endl; return static_cast<T&&>(arg);}template<class T>constexpr T&& Forwar ...
c++11—thread_local
thread_local使用
thread_local关键字指示对象拥有线程存储期,它能与static或extern结合,但是static不影响存储期。该对象的存储在线程开始时分配,在线程结束时释放。每个线程拥有一个对象实例。
全局变量
#include <iostream>#include <thread>#include <mutex>thread_local int x = 0;std::mutex t1_mutex;void print_t1() { for(int i = 0; i < 3; ++i){ x++; std::lock_guard<std::mutex> lock(t1_mutex); std::cout << std::this_thread::get_id() << " " << x << std::endl; }}int main() ...
c++可变模板参数
可变模板参数函数
可变参数模板的声明一般是template<class…>
Template<class... T>void func(T... args);
args前面有省略号,我们把这种带省略号的参数称为”参数包”,可以包含0到任意个模板参数。
一个简单的例子:
template <class... T>void F(T... args){ cout << sizeof...(args) << endl; //打印变参的个数}void test_param() { F(); F(1, 2); F(1, "", 2);}// result023
递归方式展开可变参数
我们无法直接获取参数包args中的每一个参数,只能通过展开参数包的方式来获取每一个参数。这是可变模板参数的一个主要特点。
要想实现这种展开,我们需要实现2个函数:展开函数和递归终止函数。
//递归终止函数void print(){ cout << ...
shell学习—文本检索
find
find用于在指定目录下查找文件。任何位于参数前的字符串都被视为欲查找的目录名。其支持按名称查找、按正则表达式查找、按文件大小查找等多种查找方式。使用格式如下:
find path [option] [pattern]
我们通常使用文件名称进行查找:
find path -name [pattern]
例如要查找当前目录下包含’extrinsics’的文件名,这里使用正则表达式进行匹配:
find . -name ‘*_extrinsics’
获取当前目录下包含’extrinsics’的文件名,打印文件名称,并进行单独处理:
for file in $(find . -name '*_extrinsics'); do echo 'file: '$filedone
grep
grep命令用与从文本或管道数据流中查找数据。使用格式如下:
grep [option] [pattern] file
最简单的使用,在文件中查找某个字符串,并打印匹配的行:
grep ‘test’ file
几个常用的参数:
-n 输出行号
- ...