… Read More正确而高效的使用动态库是一个很复杂的话题,这需要开发者编译和链接有相当深入的理解.
标签归档:c++
A note for cmake
A Note for CMake
CMake可以说是目前C++项目的标准构建系统, 尽管它有很多不足, 但是它已经成功的替换掉了autoconf这一代的构建工具. 除非有足够的理由, 在选择构建系统时, CMake总是应当第一优先考虑.
我熟悉的构建系统只有CMake和Bazel, 事实上, 如果能满足若干客观条件的话, 我更愿意使用Bazel, 不过这篇主要记录的是CMake, 所以还是以CMake为主. 在我看来, CMake主要的优缺点如下:
Pros:
- Imperative:
A Strory of Mixin
Mixin
Mixin是一种设计思想, 主要内容是: Mix some MixinClass into a CoreClass, so the CoreClass can get some new feature, or get enhanced.… Read More
汉诺塔问题-记录
设计模式
For C/C++ user
很多设计模式相关的资料都是用
Java
来描述的,有必要简单补充一下Java
和C++
在OOP
技术层面上的区别
- Java不支持任何形式的运算符重载
- Java明确区分接口和类,类只能从一个类派生,但是一个类可以实现多个接口
- 在Java中,所有方法默认是虚(virtual)的
- 对CPP而言,
Java
风格的接口可以视为一个只有pure virtual
SomeCpp
零碎知识点
- fflush仅仅是为了输出而设计的, 标准中并没有说明它对输入缓冲的效果.
- 一元运算符和
=
是右结合的,这和<<
是完全不同的,a=b=c
意味着a=(b=c)
,b=c
将先执行,而a<<b<<c
则是(a<<b)<<c
,a<<b
将先执行.
Some Multi Thread
… Read MoreC++标准库提供的 mutex 在大部分场合都足以保证线程安全, 但是当问题变得更加极端时,就可能需要使用lockfree风格的并行编程了. 而为了正确实现lockfree, 你将打开一扇新的大门, 接下来的名词都是在学习过程中必须正确理解的: memory model, reordering, weak(relax), strong(strict), fence, barrier, release, acquire, seq_cst, consume, mutex, futex,
Python for C++ Programner
… Read More这里谈一下个人的学习建议.
首先可以阅读官方的入门教程, 看完这一部分, 对于一个熟练的C++程序员, 应该可以凑合写出可堪一用的代码了. 对于大部分不以Python为主要工作语言的开发者,到此基本就足够了.
如果有时间,我建议直接阅读Python in a Nutshell第七章之前的内容(不含第七章),并不用完全看懂,大部分细节也不用去记忆,只需要看完即可,至此,你就能基本了解Python的运行机制, 写出质量稳定可控(不会存在低级错误)的代码了.
上面两步完成后, 对一个熟悉C++的程序员而言, 基本任何Level的Python资料都可以看了. 你可以继续看Python in
Ethash with cpp
C++ OOP编程综述
嵌套类和局部类
- 定义在类X内的类Y称为嵌套类,它就是一个普通类,只不过使用的作用域被限制了.
- 定义在函数内的类Y称为局部类,这种类限制很多,主要用于在语言层面支持Lambda,实践中基本不用.
struct(class)的内存布局
- C++的struct和class实例大小不会为0,即便它内部没有任何数据变量.主要是因为编译器总是需要为实例分配内存,使得对象能获得有效的地址,且不同对象的地址总应该是不同的.
- 类型布局相关的名词有很多,如POD,Aggragate,naive等,具体我也不是很清楚,总之很麻烦.
- 如果需要把sturct或class对象通过C风格直接从内存层面管理(如memcpy),那么要求它的内存布局是平凡的.
- 只要类型涉及到virtual, 那类型实例的首地址存储的一定是vptr, 涉及virtual只需满足任意一个条件:
- 直接或间接使用虚继承
- 直接或间接使用虚函数
一般规则
C++对象的内存布局对于理解多继承/虚继承非常重要, 基本要关注的有三点
- 对于任意一个类型
Foo
,它的编译期布局都是已知的. - 对于某个指针
Foo