c++ template
主要说下模板的声明和实现分离 如果不用std::variant的话,要实现模板声明和实现分离,需要在头文件中声名,然后在cpp里定义模板,然后要继续在cpp里声明所有要用的类型 // header.h template <typename T> void show(T t); // header.cpp template <typename T> void sh...
主要说下模板的声明和实现分离 如果不用std::variant的话,要实现模板声明和实现分离,需要在头文件中声名,然后在cpp里定义模板,然后要继续在cpp里声明所有要用的类型 // header.h template <typename T> void show(T t); // header.cpp template <typename T> void sh...
c++20的modules, 用clang编译的话 import <iostream>; int main() { std::cout << "Hello World.\n"; } 需要预先编译成模块文件 clang++和gcc的命令看起来不太一样 clang++ -std=c++20 -xc++-system-header --precompile i...
线程到底会share哪些资源? 今天看到inet_ntoa这种函数,我记得在glibc下,稍微新一点的,都应该是线程安全的,但是在openbsd下面发现并不一定。之前游双那本书里写的放到现在不全对了。 Drepper大佬在这个commit里修了这个问题。 但是apple能找到的部分,看起来还是没有改过… c语言里有很多不想管理buffer的函数实现,返回char*, 内部就用一个st...
大多数时候自赋值的检查是没有必要的,尤其是没有使用什么裸指针类型之类的。如果你自己的类里面全部是高级的类型,没有必要自己重载operator= 但有一种情况,一个类持有一个指针,且掌控这个指针的生命周期,这时候就需要自己重载operator=,来避免自赋值的情况。 class T { int* p; public: T(const T &rhs) : p(rhs.p ? n...
动态库热加载指的是在程序运行时,动态地加载动态库,从而达到不停止程序的情况下,更新程序的功能。 C++ 程序在运行时有两种方式加载动态连接库:隐式链接和显式链接 隐式链接就是在编译的时候使用 -l 参数链接的动态库,进程在开始执行时就将动态库文件映射到内存空间中 显式链接使用libdl.so库的API接口在运行中加载和卸载动态库,主要的API有 dlo...
主要资料是mem barrier,在ref-1。 如果完整看过perfbook的话,不用再看了,paul真的是神人,RCU的作者,修了linux内核1000多个多线程bug的猛男 REF Memory Barriers: a Hardware View for Software Hackers 内存屏障Memory Barrier: a Hardwar...
mutex, spinlock, semaphore, RCU一次看一下 mutex mutex有一票比较好的文章,我这里搬运一下。 Mutex: 如果一个线程试图获取一个 mutex,但是没有成功,因为 mutex 已经被占用, 它将进入睡眠,让其他进程运行,直到 mutex 被其他进程释放. 这就意味着Mutex将使得线程睡眠,然后再通过notify唤醒它们,两者都是开销比较大的...
二进制枚举技巧,快速找到下一个想要位的集合 Ref 1. 二进制枚举 / Gosper’s Hack 2. 【力扣双周赛 86】Gosper’s Hack | 单调队列 | LeetCode 算法刷题 3. 分享|从集合论到位运算,常见位运算技巧分类总结!
xmake的设计相较于ninja,cmake,make而言,我觉得他没有发明新的语法,都是复用lua的语法,虽然从core里看对lua做了一定的扩展。gn其实也是这样,感觉还是在遵循python3的语法,虽然也做了自己的扩展。 学习xmake的代码,目前主要收集资料,嘻嘻 ./xmake/ ├── actions # 内建的一些基础task,用于基本的构建安装等操作 ├── cor...
spdlog的代码走读,记录一下用到的参考资料 logger订制程度看起来是ok的,wiki-custom-format上写的, 我感觉有线程号 + 时间 + 文件行其实我就够了。 日式文件的类型扩展充分,wiki-sinks里面也放了很多种,我觉得基本有文件rotate就够了。 支持的日志模式,同步/异步,阻塞/非阻塞,单线程/多线程 spdlog主要由logger(也包括asyn...