零碎知识点
- fflush仅仅是为了输出而设计的, 标准中并没有说明它对输入缓冲的效果.
- 一元运算符和
=
是右结合的,这和<<
是完全不同的,a=b=c
意味着a=(b=c)
,b=c
将先执行,而a<<b<<c
则是(a<<b)<<c
,a<<b
将先执行.
=
是右结合的,这和<<
是完全不同的,a=b=c
意味着a=(b=c)
,b=c
将先执行,而a<<b<<c
则是(a<<b)<<c
,a<<b
将先执行.… Read MoreC++标准库提供的 mutex 在大部分场合都足以保证线程安全, 但是当问题变得更加极端时,就可能需要使用lockfree风格的并行编程了. 而为了正确实现lockfree, 你将打开一扇新的大门, 接下来的名词都是在学习过程中必须正确理解的: memory model, reordering, weak(relax), strong(strict), fence, barrier, release, acquire, seq_cst, consume, mutex, futex,
C++对象的内存布局对于理解多继承/虚继承非常重要, 基本要关注的有三点
Foo
,它的编译期布局都是已知的.Foo
throw-try-catch
是异常系统的典型三个环节.
exception
为基类的若干异常,我们可以使用这个类,也可以自定义类,该类的const char * what()
成员用于给用户提供信息.
&&
与||
不会进行短路求值.T
或T&
,而不要是指针.a<b
为假,a>b
new delete
是C++中的两个主要的表达式.
new
相当于C的malloc() + T()
,delete
相当于C
的free() + ~T()
.operator
尽管在大部分场合中,数组类型和函数类型都被转换成某种指针使用,然而它们确实是某种类型.
这一点在类型推导中很重要,因为类型推导可以推导出数组类型/函数类型
std::array
,由T
和N
两个属性决定唯一的数组类型,称T[N]
型对象为数组类型,其中N必须为constexpr
,称T array[N]
为T[N]
的一个实例.
T
xxx_cast<TYPE &>(var)
整体可以作为左值,其他情况转换得到的都是右值临时对象。const_cast
const_cast
是只用于处理const
相关的类型转换,主要是移除const
(加const完全可以用隐式转换), const_cast
只有向引用/指针的转换有实际意义.const T c_obj;
const
… Read More Const Expression, constexpr 是一个非常复杂的话题, 幸运的是, 我们在实践中
需要记住的内容并不太多,因为常见的应用场景其实比较简单.
const
限定符const
是一种编译期特性,用于限定对象的编译期写入权限, 编译器也可能将const对象视作constexpr进行优化.
trick
在运行期写入对象,但是不要这么做.