关于原子操作重新思考
首先对于单个原子操作语句来说, 它在外部看来一定是原子操作(废话), 也就是不存在“中间态”.
TAG_COLLECTION //
共有 32 篇笔记使用了这个 Tag。
首先对于单个原子操作语句来说, 它在外部看来一定是原子操作(废话), 也就是不存在“中间态”.
很神奇的, 最近在重新在思考异常安全的时候忽然发现了在 vscode 中 clangd 进行 lambda 的 inlay hints 渲染时有一个小问题 —— 就是和草案规定的顺序不对应, 详细提交查看 issue
从简单到复杂吧,多态,虚继承、菱形继承……
template, 编译期的语言, 一方面可以看成是 “ 以数据类型作为变量的函数 ”; 另一方面可以视作 “ 在编译期进行的代码生成 ( 代码渲染 ) ”
或许可以大致分为三个部分 ——
之前说过了try-catch模型, 那么异常安全实际上在思考一件事情 —— 在发生了异常之后, 整个系统现在是什么状态
又一次栽在指针上,这次涉及到多态和类型转化等略微复杂一点的,所以略作总结下.
之前说过 RAII,在构造的时候创建资源,在析构的时候释放资源,也说过左右值的事情。
左值右值,经常听的东西,于是稍微记录 —— (实际上看了 Efficient C++ 之后,结合一些新标准,觉得还是有必要写写)
直接看例子 int x 一般来说在常见的 x86-64 环境中 ——
std::atomic, 用于定义原子变量, 允许多个线程按照 C++ 内存模型进行读写等操作. 一般用于线程之间共享状态等.
简单记录Cmake使用
条件变量, 用于阻塞等待的同步元语.
讲述const在各个位置的语义和使用场景,其中 const 的作用时机主要是运行时(runtime),如果需要在编译期优先等,可以使用constexpr等关键字
这是一个编外篇, 简单说明清楚一下使用一个 localthread 来记录当前线程的设计.
《Efficient C++》Item 11 的 等号赋值这块,确实很多是之前会忽略的东西 —— 比如 a a 这种看上去有点愚蠢的写法。
Error 是问题 (废话), 那么一般来说可以分为编译期发现的和运行期间发现的. 此处简单说下 C++ 提供的一套在 Runtime 的时候对于 Error 的捕获,传播,处理等的机制 —— 也就是 Exception Handling
可恶,如此常用的东西居然没有单独写一篇,我有罪
Future, 表示这个结果我会在未来进行消费. 那么它具体怎么生产出来玩无所谓. 我持有 std::future 只是一个消费者而已.
简述一下Google Benchmark的使用。
快速的封装一个函数对象 —— 注意,是一个匿名类对象
Pointer to Implementation, 其核心思想是让公开类只保存一个指向真正实现对象的指针,保证对外暴露稳定干净的接口,同时隐藏掉内部的实现细节
在 Future 的时候说到, 它表示一个消费者 —— 我在未来可能要消费某个数据.
全称资源获取即初始化(英语:Resource Acquisition Is Initialization)
很帅气的写法, 我们还是从一个实际案例来说, 假设现在有 ——
实现一个简单的 Function Wrapper, 让传给 Job System 的 Callable 在 Runtime 打包
简单来说,是对一段连续对象序列的非拥有视图 —— 比如我们通常会使用vector,array,或者其他方式来表示一段连续空间,那么提出span看似没有什么用途,不过为什么依然会频繁的出现在接口设计当中?
简述 C++ 中的并发,聚焦在std::thread (不得不说,还得是你 golang
由这个关键字声明的变量, 在每一个线程内都有一个自己独立的实例.
在编译器对类型进行“玩弄”(查询,判断,转化)的工具
UB, 未定义的行为 —— 说明行为分为「定义」的和「未定义」的两种. (一如既往的废话)
众所周知,存储元素,动态扩容,连续存储的容器 —— vector