随笔分类 - C++_Notes
摘要:虽然平时开发都是用的c++11标准,但打算看一下wsl ubuntu里面的gcc默认支持什么标准~ 打印__cplusplus宏 #include <cstdio> int main() { printf("%ld\n", __cplusplus); } ➜ test g++ test_cpp_ve
阅读全文
摘要:C++11的thread pool实现 相关特性: thread,mutex,condition_variable,functional,atomic,template,lambda #include <vector> #include <queue> #include <memory> #incl
阅读全文
摘要:饿汉模式;懒汉模式;线程安全优化;内存泄漏优化
阅读全文
摘要:平时所使用的new和delete操作,称之为表达式,一般由好几个步骤组成。 如上图所示,new表达式会被编译器转化为三个步骤。 new表达式不能重载,但其中operator new是可以重载的。 ➡️全局::operator new的重载 why 不能放在namespace内?因为全局operato
阅读全文
摘要:关键词:虚函数表,动态绑定,多态 每个对象都维护自己的虚表指针,指向类的虚函数表。 (所以对象的size比其包含的所有数据size多4,即虚指针大小) ➡️动态绑定:(多态的实现原理) 通过指针p找到对象c的vptr 通过vptr找到class C的vtbl 在vtbl中找到第n个虚函数并调用 ➡️
阅读全文
摘要:关键词:类模板,函数模板,成员模板,模板特化 “泛化”和“特化” Tip Demo 类模板定义时需要显式地指定类型名。 函数模板定义时编译器自动进行实参推导类型(但不提供隐式转换)。 成员模板:模板中还包含模板 模板(全)特化格式:template<>尖括号内为空 模板偏特化(partial spe
阅读全文
摘要:关键词:仿函数 pointer-like:将一个类设计得像指针一样,通常通过重载*和->操作符实现。 function-like:将类的成员设计得能像函数一样使用,通过重载()操作符实现。 Tip Demo 应用:智能指针注意:->符号在作用一次后,会继续作用下去(不同于*号)Foo f(*sp):
阅读全文
摘要:关键词:类型转换,explicit Tip Demo 转换函数conversion function一般形式:operator type() const;- 不需要写返回类型- 一般来说返回const non-explicit-one-argument-ctor非显式构造,编译器自动将4构造为fra
阅读全文
摘要:关键词:动态内存分配,拷贝赋值,new/delete 与Complex类最大的差别:有动态分配的内存空间(char* m_data) Tip Demo 拷贝赋值函数的一般结构 拷贝赋值时,检测自我赋值非常重要自己的内存已经释放了,还怎么把自己赋给自己? new时做了什么?1.分配内存2.static
阅读全文
摘要:关键词:可见性, const, by value or reference Tip demo why private constructor:实现单例模式 内联的好处:减少了函数调用,效率更高。- 使用inline关键字建议编译器内联,实际是否内联由编译器决定 构造函数中,初始化时就进行赋值,效率更
阅读全文
摘要:unique_ptr,shared_ptr,weak_ptr
阅读全文
摘要:【90】【Cherno C++】【中字】stdmove与移动赋值操作符 ▶️移动构造与std::move 接上节的String类,我们可以通过string来构造新的对象dest: // 拷贝构造 String string = "Hello"; String dest = string; 为了使用移
阅读全文
摘要:【89】【Cherno C++】【中字】C++移动语义 ❓为什么使用移动语义(moving semantics)? 很多时候,我们需要通过复制来传递对象: 例如,把一个对象传递给一个函数,这个函数需要得到这个对象的所有权,我们需要在当前stack frame中构造一个一次性对象,然后复制到调用的函数
阅读全文
摘要:【85】【Cherno C++】【中字】C++的左值与右值 C++新特性:左值引用与右值引用 左值和右值 ❓什么是左值和右值? 大多数情况下,左值在等号左边,右值在右边。例如int i = 10;中变量i是左值,在内存中有实际的位置,通常有较长的生命周期;10是右值,没有存储空间,只是数字字面量,生
阅读全文
摘要:类和结构体外的静态 【21】C++中的静态(static) ▶️有两种静态: 类或结构体外的static:声明为static的符号只在该翻译单元内可见; 类或结构体内的static:声明为static的变量将与类的所有实例共享内存(所有类实例共用一个static变量)。 ▶️类外的static 静态
阅读全文
摘要:指针 【16】C++指针 ▶️指针的类型不影响指针的本质: 任何type的指针都是保存着内存地址的整数(integer)。 指针的type只用来使人更好理解。 // 一个最简单的void类型指针,储存内存地址0 void* ptr = 0; void* ptr = NULL; void* ptr =
阅读全文
摘要:【7】C++链接器是如何工作的 ▶️mingw的编译过程 参考资料 编译过程分为四个步骤:预处理、编译、汇编、链接。 预处理:使用g++ -E learn.cpp -o learn.i命令,预处理后得到learn.i文件; 编译:成汇编代码的过程,使用命令g++ -S learn.i -o lear
阅读全文
摘要:【10】【Cherno C++】【中字】C++头文件 ❓如何使用别的文件中定义的函数? —>将函数声明拷贝到该文件中? —>使用#include ”.h”可以做到这一点,将函数声明拷贝到每个需要使用函数的文件中。 ▶️井号#的作用:预处理命令,表示在C++文件实际编译之前就处理。 ▶️头文件中#pr
阅读全文