Mudo C++网络库第十一章学习笔记
2018-10-25 14:05
169 查看
反思C++面向对象与虚函数
- C++语言学习可以看《C++ Primer》这本书;
- 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对象语义;
朴实的C++设计
- 实用当头, 朴实为贵, 好用才是王道;
- C++ 是一门(最)复杂的编程语言, 语言虽复杂, 不代表一定要用复杂的方式来使用它;
- 不一定非得有基类和派生类的设计才是好设计;
- 一个类代表一个概念;
- 让代码保持清晰, 给我们带来了显而易见的好处;
- 不要因为某个技术流行而去用它, 除非它确实能降低程序的复杂度;
- 在C++这样需要自己管理内存和对象生命期的语言里, 大规模使用面向对象、继承、多态多是自讨苦吃;
C++编译器ABI的主要内容主要包括几个方面:
- 函数传递的方式, 比如x86-64用寄存器来传函数的前4个整数参数;
- 虚函数的回调方式, 通常是vptr/vtbl机制, 然后用vtbl[offset]来调用;
- struct和class的内存布局, 通过偏移量来访问数据成员;
- name mangling;
- RTTI 和异常处理的实现;
- 避免使用虚函数作为库的接口; 因为这样会给保持二进制兼容性带来很大的麻烦;
虚函数作为库的接口的两大用途
- 调用;
- 回调, 也就是事件通知, 比如网络库的连接建立, 数据到达, 连接断开等;
- 混合使用;
iostream的用途与局限
- C++ iostream的主要作用是让初学者有一个方便的命令行输入输出试验环境, 在真实的项目中很少用到iostream; 不用花大量的精力在iostream的格式化与manipulator(格式操作符)上;
-
返回的是malloc()分配的内存, 要求调用端自己free()掉;
数据抽象所需的语言设施
- 支持数据聚合(data aggregation);
- 全局函数与重载;
- 成员函数与private数据;
- 拷贝控制(copy control);
- C++ class是值语义, copy control是实现深拷贝的必要手段, 而且ADT用到的资源只涉及动态分配的内存, 所以深拷贝是可行的;
- 操作符重载;
- 效率无损, 抽象不代表低效; 在C++中, 提高抽象的层次并不会降低效率;
C++经验谈
- 练从难处练, 用从易处用;
- 软件开发一定要时刻注意减少不必要的复杂度;
- 作为应用程序的开发者, 对技术的运用要明智, 不要为了了解难度系数为10的问题而去强攻难度系数为100的问题, 这就本末倒置了;
- 用异或来交换变量是错误的;
- 未定义的行为, 在C/C++语言的一条语句中, 一个变量的值只允许改变一次(像x = x++这种代码都是未定义行为, 因为x有两次写入);
- 现在的编译器会把std::reverse()这种简单函数自动内联展开, 生成出来的优化汇编代码和其他代码一样快;
- 不要猜(guess), 要测(benchmark);
- 不要重载全局::operator new(); 按现代C++的手法(RAII)来管理内存, 很难遇到什么内存方面的错误;
-
内存管理的基本要求是不重不漏 -- 既不重复delete, 也不漏掉delete;
-
Python的代码很好读;
-
用于函数内部修饰变量, 即函数内的静态变量; 使用静态变量的函数一般是不可重入的, 也不是线程安全的;
-
static关键字又有了两种新用法: 用于修饰class的数据成员, 即所谓的静态成员, 这种数据成员的生存期大于class的对象(实体/instance);
-
消息格式: XML, JSON, Protobuf, 难的是消息内容;
-
读过教程和文档, 做过练习 -- 读过《UNIX网络编程》《TCP/IP详解》并理解TCP/IP协议, 读过本系统的manpage;
-
proxy的作用: 连接的管理更加复杂, 既要被动接受连接, 也要主动发起连接, 既要主动关闭连接, 也要被动关闭连接, 还要考虑两边速度不匹配;
-
谈到Unix编程和编程编程, W.Richard Stevens是个绕不开的人物;
[APUE]、两卷《UNIX网络编程》、三卷《TCP/IP详解》;
-
从使用者(程序员)的角度, 以tcpdump为工具, 对TCP协议抽丝剥茧, 娓娓道来;
-
UNP是Sockets API的权威指南;
-
这本书属于专家经验总结类的书籍;
-
《TCP/IP Illustrated, Vol.2: The Implementation》, 称为TCPv2;
-
《C++ Primer》的主要内容是精解C++语法(syntax)与语意(semantics)并介绍C++标准库的大部分内容(含STL);
相关文章推荐
- 《VC++深入详解》学习笔记 第十一章 图形的保存和重绘
- 《COM原理及应用》学习笔记之第十一章
- 第十一章:持有对象 《Thinking in java》学习笔记
- 《c++ templates》学习笔记(8)——第十一章 模板实参演绎
- 《JAVA编程思想》学习笔记——第十一章 持有对象
- Mudo C++网络库第七章学习笔记
- 第十一章:持有对象《thinking in Java》学习笔记
- 《COM原理及应用》学习笔记之第十一章
- 《疯狂JAVA讲义》学习笔记第二天
- python学习笔记——字典
- 《从零开始学Swift》学习笔记(Day 46)——下标重写
- 《设计模式》学习笔记8——外观模式
- 学习笔记7 cookie 出现乱码
- 《Effective C++》学习笔记——条款41
- 《Composing Programs》学习笔记(1.3)定义新函数(关键词:软件工程/函数)
- WCF4.0进阶系列—第十一章 编写代码控制配置和通信(下)
- 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象
- 《MYSQL必知必会》学习笔记(4-8章)
- 《Maven权威指南》学习笔记(一)
- GET/POST请求的使用《极客学院 --AFNetworking 2.x 网络解析详解--2》学习笔记