memory barrier

根据上一篇文章https://vinci-897.github.io/volatile-in-cpp/中memory order部分提到的内容,我们知道,不同的cpu有不同的memory model和memory order,这导致cpu会对代码进行重排序,虽然单线程上编译器和cpu对代码的重排序都不会导致最终结果的不同,但当代码在一个cpu核心上执行时,由于多核缓存不同步等问题,其他的cpu核心会看到与原有代码顺序不同的访存顺序,这就是我们所说的乱序执行,这会引起一些问题。

编译期重排序已经在上一篇文章中描述过,因此本文中,我们所说的都是cpu内存模型导致的指令重排序。我认为,编译器的优化行为是从单线程角度考虑的,重排时会保证单线程逻辑不变,而cpu乱序执行。对于单核cpu内部看来访存顺序也是不会改变的,仅仅是对其他cpu核心来说访存行为的顺序改变

Read more

为什么不可以emplace_back({1, 2})?

在cpp代码中,我们可以写出如下的代码:

1
2
vector<pair<int, int>> vec;
vec.push_back({1, 2});

然而,vec.emplace_back({1, 2})会报错,我们只能vec.emplace_back(1, 2)

why push_back works?

对于void push_back( T&& value ),由于下面这两条规则,我们可以使用一个braced-init-list作为函数的参数(所谓的braced-init-list就是大括号)。

Read more