随笔分类 -  C/C++

摘要:std::function与std::bind std::function std::function 是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。 例如 // 普通函数 int a 阅读全文
posted @ 2024-12-03 10:30 如果的事 阅读(437) 评论(0) 推荐(0)
摘要:内存对齐 先了解下C/C++基本类型的字节占用情况, alignas 关键字 #pragma pack(N) pragma pack 规定的对齐长度,实际使用的规则是: 结构(如struct,union,或者class )内部的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pra 阅读全文
posted @ 2022-05-06 18:45 如果的事 阅读(834) 评论(0) 推荐(0)
摘要:Thread Local Storage 我们知道多线程共享同一个进程的地址空间,对全局变量来说,某一个线程对其修改会影响其他所有线程。 如果我们需要一个变量在每个线程中都能访问,并且值在每个线程中互不影响,这就是 Thread Local Storage(TLS,也称 “线程私有数据”)。 Lin 阅读全文
posted @ 2021-07-13 16:13 如果的事 阅读(1336) 评论(0) 推荐(0)
摘要:C++ 浮点数的存储与精度 先看个例子(如下),我们看下int、float、double在内存的二进制表示 #include<stdio.h> #include <stdlib.h> #include <string.h> #include<cstdlib> bool isLittleEndian( 阅读全文
posted @ 2021-01-09 17:23 如果的事 阅读(5503) 评论(0) 推荐(2)
摘要:C++ Singleton Lazy Singleton C++11的一个Lazy Singleton(懒汉)版本: class Singleton { public: Singleton(const Singleton&) = delete; Singleton& operator=(const 阅读全文
posted @ 2020-12-01 12:33 如果的事 阅读(1394) 评论(0) 推荐(0)
摘要:clone linux 创建线程(pthread_create)和进程(fork)的过程非常类似,都是主要依赖 clone 函数,只不过传入的参数不同而已。 如此一来,内核只需要实现一个 clone函数,就既能创建进程,又能创建线程了,例如; 创建进程: clone(SIGCHLD) 创建线程: c 阅读全文
posted @ 2020-11-30 18:29 如果的事 阅读(2480) 评论(0) 推荐(0)
摘要:allocator类 C++中,内存分配和对象构造紧密纠缠(new),就像对象析构和回收一样(delete)。如果程序员想接管内存分配,即将内存分配和对象构造分开,对于前者,主要是分配和释放未构造的原始内存;对于后者,主要是在原始内存中构造和撤销对象。 分配和释放未构造的原始内存 两种方法: all 阅读全文
posted @ 2020-02-11 08:41 如果的事 阅读(1412) 评论(0) 推荐(0)
摘要:C++ new与delete new operator 和 delete operator new operator 和delete operator 是运算符, 我们知道new运算符会干2件事:申请内存和调用对象构造函数,比如,当我们new一个string对象: string *ps = new 阅读全文
posted @ 2019-12-26 21:40 如果的事 阅读(1284) 评论(0) 推荐(0)
摘要:C++11 并发编程 C++11 新标准中引入了几个头文件来支持多线程编程,他们分别是: <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。 <thread>:该头文件主要声明 阅读全文
posted @ 2019-12-09 15:42 如果的事 阅读(1244) 评论(0) 推荐(0)
摘要:C++ RAII 与 ScopeGuard RAII机制 RAII(Resource Acquisition Is Initialization),也就是“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用 阅读全文
posted @ 2019-12-05 16:52 如果的事 阅读(3286) 评论(0) 推荐(0)
摘要:C++ 右值引用与move 右值引用 C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。 所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达 阅读全文
posted @ 2019-12-05 11:22 如果的事 阅读(3930) 评论(0) 推荐(1)
摘要:C++ 类型转换 C风格转换 对于内置类型而言,C风格转换就很好用,例如: int i; double d; i = (int) d; // i = int(d) 然而,这样的转换符不能应用于类(class)和类的指针。 ANSI-C++标准定义了四个新的转换符,用于控制类(class)之间的类型转 阅读全文
posted @ 2019-11-21 20:31 如果的事 阅读(777) 评论(0) 推荐(0)
摘要:关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。 多态 函数重载(overload) 相同的作用域(在同一个类中); 函数名字相同、参数(类型或个数)不同; virtual关键字可有可无; 隐 阅读全文
posted @ 2019-11-19 21:15 如果的事 阅读(283) 评论(0) 推荐(0)
摘要:C++ 智能指针 unique_ptr 大概长这个样子 //大概长这个样子(化简版) template<class T> class unique_ptr{ T* ptr; }; unique_ptr是独占性智能指针, 某个时刻只能有一个uniqueptr指向一个给定对象; 当uniqueptr被销 阅读全文
posted @ 2019-11-13 20:57 如果的事 阅读(314) 评论(0) 推荐(0)
摘要:extern extern的两个作用: 修饰变量或函数,提示编译器此变量或函数是在其它文件中定义的,但要在此处引用; 进行链接指定,如: extern "C" void fun(int a, int b); 告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,; stat 阅读全文
posted @ 2017-06-09 19:00 如果的事 阅读(1304) 评论(0) 推荐(0)
摘要:举例,一个结构体的定义如下: 对齐 如果直接对上面的结构体作sizeof()运算: 如果在成员名后面加上冒号,指定占用的bits数,可以节省结构体的大小,例如: 可以使用下面的宏计算结构体中某个成员的偏移位置: 演示如何计算成员的位置: 初始化 结构体变量在定义的同时进行初始化,类似于数组的初始化: 阅读全文
posted @ 2017-02-06 19:07 如果的事 阅读(359) 评论(0) 推荐(0)
摘要:C++中const 关键字的用法const修饰变量const 主要用于把一个对象转换成一个常量,例如:const int size = 512;size = 0; // error: assignment of read-only variable上面的例子中,定义size为常量并初始... 阅读全文
posted @ 2015-04-12 02:33 如果的事 阅读(2381) 评论(0) 推荐(0)
摘要:先看一个fork的例子:int glob = 4;int main(void) { int var, pid; var = 88; if ((pid = fork()) B1 --> C1|--> B2可见,B1、B2继承自A,而C1继承自B1。1、B1是在i=0时复制A的,此... 阅读全文
posted @ 2014-11-26 13:09 如果的事 阅读(841) 评论(0) 推荐(0)
摘要:协程的原理和应用 在一些高并发应用场景中如果使用多线程(每个请求一个线程),每个请求的大部分时间可能都是阻塞在IO上,会带来很多线程切换的开销(C/C++ 线程的切换是由内核控制的);多线程以外,一般有2种其它方案,一个是用IO多路复用(如 Nginx、Redis都用 epoll 实现非阻塞网络IO 阅读全文
posted @ 2014-10-16 00:58 如果的事 阅读(16142) 评论(2) 推荐(2)
摘要:带变长参数的函数很多语言都支持带变长参数的函数,C也不例外,我们常用的比如printf()函数,它的函数原型中参数列表里面有一个省略号,就代表了可变参数列表,可以先看下它的实现:int printf(char *fmt, ...){ static char sprint_buf[1024]; ... 阅读全文
posted @ 2014-04-23 23:13 如果的事 阅读(1330) 评论(0) 推荐(1)