- tags: Programming Language
C/C++
Links to this note
C++ Lambda
tags: C/C++ Capture a map with reference If we capture a map by value, then we can’t use the operator []: unordered_map<int, int> freq; // Won't compile // auto comp_by_map = [freq](const int& a, const int& b) { return freq[a] < freq[b];}; auto comp_by_map = [&freq](const int& a, const int& b) { return freq[a] < freq[b];};
Integer Overflow
tags: C/C++ In some problems, we need to detect is our result overflow in a 32-bit integer. The key ideas is check our value before it becomes bigger. For example: // INT_MAX 2147483647 // INT_MIN -2147483648 // INT_MAX's suffix is 7 if (res > INT_MAX / 10 || (res == INT_MAX / 10 && pop > 7)) { return 0; } // INT_MIN's suffix is -8 if (res < INT_MIN / 10 || (res == INT_MIN / 10 && pop < -8)) { return 0; } res = res * 10 + pop; Our final result need a 10 times current value and plus a value, then we check:...
set vs unordered_set in C++ STL
tags: C/C++ source: GeeksforGeeks. “Set vs Unordered_set in C++ STL,” May 28, 2018. https://www.geeksforgeeks.org/set-vs-unordered_set-c-stl/. set Ordered set that implemented by a “Self balancing BST” like Red-Black Tree. Extra find operations equal_range returns range of elements matching a specific key lower_bound returns an iterator to the first element not less than the given key upper_bound returns an iterator to the first element greater than the given key #include <iostream> #include <set> #include <assert....
OrderedSet
tags: C/C++,Java,Data Structures In C++ the set container is an ordered or sorted set, unordered_set is the normal set in C++. Differences between them please check set vs unordered_set in C++ STL. In Java there is an java.util.SortedSet interface.
C/C++ 多态
tags: C/C++ 只能通过抽象类的指针或引用调用动态解析子类函数,虚函数表示需要动态解析,纯虚函数必须被子类覆盖,否则无法实例化。
C++ 弱同步原子(acquire/release atomic)
tags: C++11 内存模型,C/C++ C++ 还添加了较弱的原子,可以使用 atomic_store_explicit 和 atomic_load_explicit 以及附加的n内存排序参数来访问这些原子。使用 memory_order_seq_cst 使显式调用等效于C++ 同步原子(atomic)较短的调用。 较弱的原子称为 acquire/release 原子,一个 release 如果被后来的 acquire 观察到,那么就创建了一个 happen-before 的关系(从 release 到 acquire)。这个术语意在唤起 mutex:release 就像 unlock mutex , acquire 就像锁定同一个 mutex 。release 之前执行的写入必须对后续 acquire 之后执行的读取可见,就像解锁 mutex 之前执行的写入必须对后解锁 mutex 之后执行的读取可见一样。 atomic<int> done; // Thread 1 // Thread 2 atomic_store(&done, 1, memory_order_release); while(atomic_load(&done, memory_order_acquire) == 0) { /* loop */ } acquire/release 原子只对单个内存位置的操作进行顺序一致的交替执行,所以属于内存一致性(coherence)而非顺序一致性。 来看下面 litmus test: Litmus Test: Store Buffering Can this program see r1 = 0, r2 = 0?...
C++ 非同步原子(Relaxed atomic)
tags: C++11 内存模型,C/C++ C++ 并没有仅仅停留在内存一致性(coherence)的C++ 弱同步原子(acquire/release atomic)。它还引入了非同步原子,称为 relaxed 原子(memory_order_relaxed)。这些原子根本没有同步效果——它们没有创建先发生的边——并且它们根本没有排序保证。事实上,宽松原子读_写和普通读_写没有区别,除了宽松原子上的竞争不被认为是竞争, 不能着火 。
C++11 内存模型
tags: C/C++,Memory Model,编程语言内存模型 受新的 Java 内存模型(2004)许多同样的人开始为 C++ 定义一个类似的内存模型,最终在 C++11 中采用。 两个重要方便的差异: C++ 对具有数据竞争的程序不做任何保证 C++ 提供了三种原子性:强同步(顺序一致性),弱同步(内存一致性(coherence))和无同步(“relaxed”,用于隐藏竞争)。 第一点尝试消除对 Java 模型的复杂性需求,“relaxed” 的原子性重新引入 Java 关于定义什么是竞争程序的所有复杂性。结果是C++模型比Java更复杂,但对程序员的帮助更小。
C/C++ thread-local storage
tags: C/C++ source: All about thread-local storage
GDB
tags: C/C++,Programming Tools
C++ LSP
tags: Emacs,LSP,C/C++,CMake 通过如下命令生成 clangd 识别的编译配置文件 mkdir build cd build cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. mv compile_commands.json ../ 然后重启 M-x lsp-restart-workspace RET 即可。
Member initialize
tags: C/C++ 如果类成员属性是值类型或者引用类型则需要改对象有无参数构造方法,否则类无法实例化, 这是因为这类成员属性在构造函数调用之前就需要进行初始化。 下面代码无法通过编译 class Foo { public: Foo(int n) : n {n} { }; ~Foo() { }; private: int n; }; class Bar { public: Bar(int n) { this->foo = Foo(n); }; ~Bar(); private: Foo & foo; };
Iterator class
tags: C/C++ 容器类实现 begin 和 end 方法返回 Iterator class 的实例, Iterator class 通过实现友元类可以直接访问容器类的私有属性, Iterator class 通过重载 ++/==/* 等操作符实现对容器类的访问并通过自己的私有属性记录当前位置。 Iterator class 重载的操作符: ++ 移动容器元素位置 == 判断两个容器位置是否相等(容器是否一个,位置是否一个) * 解引用返回当前位置指向的容器的值
SSE/AVX/AVX2/AVX512
tags: Computer Systems,C/C++,优化,High Performance 部分 intel CPU 支持向量指令集同时进行多路整数和浮点数计算,以此来进行对相关算法进行优化,这里整理相关链接: 编译器支持相关封装避免编写汇编代码,官方指南:Intrinsics Guide 基于 sse_mathfun 的 avx_mathfun 封装相关宏和函数 mp3 库 lame 中的 SSE 加速实现 libmp3lame/vector/xmm_quantize_sub.c AVX512 VNNI https://en.wikichip.org/wiki/x86/avx512_vnni
CMake
tags: C/C++,Programming Tools 安装的头文件必须包含在目标的源代码中,否则构建如 iOS 的 Framework 时无法正确包含头文件 ADD_LIBRARY(test test.h) CMake 生成 C++ LSP 配置文件