随笔分类 - C/C++
摘要:gcc 编译文件加上 -g 选项 生成可执行程序a,带有调试信息 对生成的文件执行 gdb a 就会进入调试程序 命令: 按l查看代码,代码会带有行号 list 按b 10 将在第十行设置断点 breakpoint i b 查看所有的断点 r 开始执行 run c 继续执行 continue n n
阅读全文
摘要:mem_fn 想到member function 成员函数 这还真就是用来调用成员函数的 普通的函数我们通过函数指针可以调用,但对于成员函数的调用稍微复杂一点,需要对象,也即this指针 因为成员函数和对象并不存储在一起,一个对象的内存空间不包括函数代码,否则每个对象都包含自己的函数代码,内存就比较
阅读全文
摘要:A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads. pro
阅读全文
摘要:创建项目再进行测试比较麻烦,可以使用这个在线编译器进行验证,快速方便 C++11在线编译器 mutex是互斥锁,互斥量 condition_variable是条件变量,条件变量也是被多线程访问,所以也需要使用互斥量,上锁后访问 std::mutex m; void fun(){ std::uniqu
阅读全文
摘要:const表示一个变量的值不能改变,这个值可以使运行期间得到的const int sz = get_size(); constexpr是提示编译器,该值可以在编译期间就计算出来,并进行替换,不用等到运行时计算,能够提升程序性能 constexpr的初衷就是,有些信息可以在编译期间进行利用,将能计算出
阅读全文
摘要:NRV,named return value 某个函数返回一个对象时,在外部接收 A a = Fun(); 会调用复制构造函数 会损失性能 为何不能将函数Fun定义成传入引用a,然后直接在a上进行操作的函数? 编译器的NRV优化就是这个思想 将这种函数转化为传入引用参数,返回类型为void的函数 A
阅读全文
摘要:以线程池举例 线程池需要接收要执行的任务,这些任务需要形成一个队列 任务可以是函数,lambda,重载括号运算符的类 那么在定义一个数组去保存这些任务该如何定义? class my_thread { using task_type = void(*)();//相当于typedef别名 my_queu
阅读全文
摘要:template<class... T> void f(T... args){ cout << sizeof...(args) << endl; } sizeof...一整个是运算符 可以通过递归或逗号表达式方式展开该参数包 可以使用这种可变参数模板初始化一个可变长的数组 使用 int arr[]
阅读全文
摘要:A是个类,B中包含A类的对象 在执行构造函数的时候,如果内部有类对象,使用列表初始化效率会更高 B中的a和b都是A的对象 a是用的列表初始化 b是在构造函数内部初始化 a只会执行一次构造函数,而b则是先执行默认构造函数,再执行一次赋值运算符函数 可以这么理解,只要包含类对象,就会在进入构造函数函数体
阅读全文
摘要:何时调用赋值函数何时调用拷贝构造函数 String c = a; // 调用拷贝构造函数,最好写成 c(a),构建了一个新的对象c c = b; // 调用赋值函数,此时已有对象c,只是对c进行赋值
阅读全文
摘要:零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术 vector的函数emplace_back() 它跟push_back()函数一样可以将一个元素插入容器尾部 区别在于使用push_back()函数需要调用拷贝构造函数 而使用emplace_back()插入的元素原地构造,不需要
阅读全文
摘要:###封装 ###继承 ###多态 允许将子类类型的指针赋值给父类类型的指针 ####多态的实现方式 静态多态 重载overload,允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同) 泛型编程,模板之类的 动态多态 覆盖override,子类重新定义父类的虚函数
阅读全文
摘要:class dog{ int name; public: dog(); void printname(); }; dog::dog(){ cout<<"dog构造"<<endl; }; void dog::printname() { cout<<"dog"<<endl; } int nihao(){
阅读全文
摘要:###纠正下英文翻译,一直以为是left right value lvalue:locator value 翻译为左值?可定位的值 rvalue:read value 翻译为右值?可读的值 似乎放在等号左边的叫左值,右边的叫右值? lvaue是指存储在内存中、有明确存储地址(可寻址)的数据,可以通过
阅读全文
摘要:###主要和深浅拷贝有关 当类对象中包含指针,指针会通过new的方式从堆中申请的空间,在销毁时需要释放对应的内存空间 在调用拷贝构造函数时,对于该指针的拷贝,需要通过深拷贝,即在堆中申请内存的方式来构造一个全新的类对象,避免两个对象的指针指向同一块儿内存区域(浅拷贝) 如果被拷贝的对象即将被释放,或
阅读全文
摘要:C语言调用Linux的输入输出api来实现IO 在此基础上添加了缓存机制,减少写盘次数,提高性能
阅读全文
摘要:##命名 linux下,动态库以.so结尾,静态库以.a结尾 libxxx.a/libxxx.so gcc链接这些库的时候使用的是该库的名字xxx而不是全称libxxx.a ##静态库制作和使用 ###静态库制作 gcc -c 命令处理.c文件生成.o文件,-c命令表示只编译不链接这些生成的.o文件
阅读全文
摘要:
阅读全文
摘要:在编写模板类时,不要分头文件和.cpp文件,即不要将定义和实现分成两个文件 统一都写在头文件就好,#include 头文件就可以了 如果分开写的话,会报错 因为你所谓的实现代码,比如某个成员函数,实际上还是一份模板而已,因为开头要加上template <typename T> 编译器要根据实际需要的
阅读全文
摘要:文件名 makefile或者Makefile makefile中的第一条是主线,其余的规则都是为了第一条服务 语法格式: 目标文件:依赖文件 命令 命令前需要tab缩进 #main: main.cpp http_conn.cpp thread_pool.cpp sync.cpp # g++ $^ -
阅读全文