unlikely()
likely,用于修饰if/else if分支,表示该分支的条件更有可能被满足。而unlikely与之相反;unlikely修饰的分支,表示该分支不太可能被满足。
auto
auto的推导规则:
规则1:声明为auto(不是auto&)的变量,忽视掉初始化表达式的顶层const。即对有const的普通类型(int 、double等)忽视const,对常量指针(顶层const)变为普通指针,对指向常量(底层const)的常量指针(顶层cosnt)变为指向常量的指针(底层const)。
规则2:声明为auto&的变量,保持初始化表达式的顶层const或volatile 属性。
规则3:若希望auto推导的是顶层const,加上const,即const auto。
find()函数:
find函数完成最简单的搜索。它查找参数指定的字符串,若找到,则返回第一个匹配的下标,否则返回npos:
std::make_pair
make_pair函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }
一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象。
另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。但是这样会出现如下问题:
例如有如下两个定义:
std::pair<int, float>(1, 1.1);
std::make_pair(1, 1.1);
其中第一个的second变量是float类型,而make_pair函数会将second变量都转换成double类型。
push_back():在Vector最后添加一个元素(参数为要插入的值)
std::make_shared
C++11 中引入了智能指针, 同时还有一个模板函数 std::make_shared 可以返回一个指定类型的 std::shared_ptr, 那与 std::shared_ptr 的构造函数相比它能给我们带来什么好处呢 ?
shared_ptr维护引用计数需要的信息
强引用, 用来记录当前有多少个存活的 shared_ptrs 正持有该对象. 共享的对象会在最后一个强引用离开的时候销毁( 也可能释放).
弱引用, 用来记录当前有多少个正在观察该对象的 weak_ptrs. 当最后一个弱引用离开的时候, 共享的内部信息控制块会被销毁和释放 (共享的对象也会被释放, 如果还没有释放的话).
使用原始的new函数创建shared_ptr
首先是原始的new分配了原始对象, 然后将这个对象传递给 shared_ptr (即使用 shared_ptr 的构造函数) , shared_ptr 对象只能单独的分配控制块。
控制块包含被指向对象的引用计数以及其他,也就是说,控制块的内存是在std::shared_ptr的构造函数中分配的。
使用make_shared创建shared_ptr
如果选择使用 make_shared 的话, 内存分配的动作, 可以一次性完成,因为std::make_shared申请一个单独的内存块来同时存放指向的对象和控制块,这减少了内存分配的次数, 而内存分配是代价很高的操作。同时,使用std::make_shared消除了一些控制块需要记录的信息,减少了程序的总内存占用。
使用make_shared的缺点
创建的对象如果没有公有的构造函数时,make_shared无法使用。
使用make_shared内存可能无法及时回收,对内存要求要的场景需要注意。
std::move
std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。
变量表达式是一个左值,即使这个变量是一个右值引用类型,也是将其看成是左值的。
可以通过move库函数来获得绑定到左值上的右值引用。
移动语义,允许直接转移对象的资产和属性的所有权,而在参数为右值时无需复制它们。
换一种说法就是,std::move() 将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。因此,通过std::move(),可以避免不必要的拷贝操作。
override:
描述:override保留字表示当前函数重写了基类的虚函数。
目的:1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。
用法:在类的成员函数参数列表后面添加该关键字既可。