学习让我快乐

争于世, 不争于势;简洁, 高效, 赏心悦目

Golang C++11 中的原子操作对比

在学习 C++11 中新增的原子操作以及相应的 memory model 之后; 再看 golang 中的 sync/atomic, 可以发现 sync/atomic 提供的是纯粹的原子操作, 等同于 c++11 中的 std::memory_order_relaxed. 所以 The Go Memory Model 在介绍 golang memory model 并未提及到 atomic ...

The Go Memory Model

Introduction 略 Advice 当数据被多个 goroutines 同时 accesse(存取) 时, 这些 access must serialize. To serialize access, protect the data with synchronization primitives(同步原语), such as channel operations, thos...

The Go Programming Language Specification

参考: 1.6.3 Source code representation 源码文件使用 UTF-8 文件存放. Lexical elements Comments 与 C++ 一致. Tokens Token 分为四类:identifiers, keywords, operators and delimiters, and literals White...

Gcc 使用 init priority 控制全局变量初始化顺序

init_priority 在 C++ 标准中,对于全局变量的初始化顺序,只规定了若全局变量的定义在同一 translation unit (可以理解为:源文件) 中,则定义的顺序决定了初始化的顺序,并没有规定跨 translation unint 的情况下初始化顺序. gcc 中可以通过__attribute__((__init_priority__(PRIORITY)))在全局变量定...

C++-引用限定符

引用限定符 引用限定符;可以在参数列表之后使用引用限定符来指定this对象的左值与右值属性; 若引用限定符为&,则表明this对象指向着左值对象; 若引用限定符为&&,则表明this对象指向着右值对象. struct X { void foo() &; void foo() &...

C++ 模板

Traits, SFINAE, CRTP

type_traits 利用了模板特化的特性;具体可以参见奇异递归模板模式 SFINAE SFINAE;Substitution failure is not an error,替代失败不是一个错误;即编译器在实例化模 板时若无法推导出模板实参的值,或者无法确定函数的原型;则认为替代失败,此时并不会视为一个编译错误, 而是将无法推导的模板函数从候选函数集中移除,...

MESI protocol

关于 MESI MESI 是一种使用广泛的协议,用来实现 cache coherence 和 memory coherence. MESI 细节 MESI 仅是一种协议!并没有与具体的硬件关联. MESI 中的缓存模型 cache,cache line;cache 与 cache line 是 2 回事;其中 cache line 是固定大小(一...

Cpu Cache 简单介绍

嗯,…,真的是很简单的介绍咯 @_@ CPU Cache 为何引入 一张比较直观的时间图: execute typical instruction; 1 ns; L1 cache reference,从 L1 cache 中取数据; 0.5 ns L2 cache reference,从 L2 cache 中取数据; 7 n...

Address Sanitizer 使用

Address Sanitizer 是什么 Address Sanitizer;是一种检测内存读取是否合法的一种机制.其会在应用访问无效内存时 给出错误信息. Address Sanitizer 实现机理 Address Sanitizer;会在进程的内存空间中开设一段影子内存区,并将进程的整个内存空间与该内存区建 立一种映射关系;具体就是将进程内存空间中的 8...

FBString 源码分析

COW 机制 首先 COW 机制是有一点优点的,主要是大尺度字符串下,如: { std::string str (10 * 1024 * 1024,'c'); std::string str1 = str; PP_QQ_LOG_D("std::string: %s",str1.data() == str.data() ? "采用 COW" ...

总在需要的时候使用 noexcept

总是在需要的时候使用noexcept(true)来标识你的函数.这样可能会提升性能! 不使用noexcept(true)来标识函数 #include <stdio.h> #include <vector> struct X { X() = default; X(const ...

C++11-原子操作

基本概念 memory location memory location;或者是 scalar type 类型对象,或者是具有非0宽的位域最长序列. 多个线程同时读写多个 memory location 是线程安全的;多个线程以只读的方式访问同一 memory location 也是线程安全.仅当多个线程以同时以读写的方式访问同一 memory location(并且没有做任何...

C++并发编程实践

同步并发操作

等待未来事件 现实世界中的需求 未来事件;(这是我瞎诌的一个概念),在未来某个时间点发生;并且只会发生一次;而且发生时可能会携带数据, 也可能不会. 在编程中经常会碰到,一个线程需要等待未来事件发生后才能继续执行;或者多个线程等待同一个未来事件发生. C++ future,shared_future 设施 future<T>,shared_future<...