《Linux多线程服务端编程:使用muduo C++网络库》笔记(2)

本文探讨了C++的编译链接模型,强调了头文件管理、静态库与动态库的优缺点。此外,文章提及面向对象设计原则,建议避免不必要的继承,提倡使用std::function和std::bind实现多态。最后分享了一些C++编程的经验,如避免异或交换变量,慎用匿名namespace,以及采用利于版本管理的代码格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

C++编译链接模型

  • C++为了完全兼容C,包括C的编译/内存模型等,继续使用单遍编译,要求前向声明,要使用include等,导致编译缓慢,且在重载、虚函数等方面实现复杂
  • include将引用文件替换至当前位置,会导致代码量增多,同时include的顺序可能导致实际结果不一样
  • 前向声明可能导致函数位置互换后结果不一样
  • 头文件使用规则:
  1. 文件之间依赖尽量最小、定义式之间依赖尽量最小,避免循环依赖
  2. 让class的名称、头文件、源文件名具有相关性
  3. 令头文件自给自足
  4. 头文件内写宏,防止重复编译。#ifndef #define? #endif
  5. 如果编写程序库,公开的文件应表达模块的接口
  • 动态库的更新会影响调用者程序,会改变其他软件的功能。需要让多个大版本的动态库能够共存以保证所有调用者的独立性
  • 静态库的编译会在软件编译前,两者编译时的依赖库版本可能不同,会导致编译错误、不可预期的运行时错误。需要保证静态库与程序编译时的环境一致。
  • 静态库演化需要在底层库新增变体后,所有依赖它的高层库/程序都为之编译一个版本,多种组合方式会导致版本爆炸式增长:cab1.0_net1.2_boost1.40_gcc44_……
  • 静态/动态库都可能因为C++头文件与源文件分离的特性出现发布的库文件与头文件不一致的情况
  • 尽量用源码编译,虽然比调用库编译时间长,让build工具能够自动check out库的源码。如gyp、typhoon-blade、CMake、SCons等工具

C++面向对象与虚函数

  • 多组合少继承,不符合A is B就不继承。代码应以实用、朴实、好用、易懂为目标编写,而不是为了实用C++各种编程范式和特性而写
  • 软件开发的首要技术使命是控制复杂度,不要因为某种技术流行就直接使用,除非能降低复杂度
  • 设计模式是常用问题的解决方案,也是绕过C++语言限制的技巧
  • C/C++二进制兼容性,涉及到库的更新需要考虑。library的ABI,主要包括:
  1. 函数参数传递方式
  2. 虚函数的调用方式
  3. struct/class的内存布局,偏移量访问数据成员
  4. name mangling(重载的重命名算法)
  5. RTTI(运行时类型信息识别,多态用)和异常处理实现
  • 源码兼容,二进制不兼容的例子:
  1. 给函数增加默认参数
  2. 增加虚函数,会导致vtbl排列变化
  3. 增加默认模板类型参数会改变name mangling
  4. 改变enum值,增加class数据成员也会导致sizeof(class)变大
  • 解决方案:采用静态连接(不是静态库,是从源码编译)、为动态库增加版本管理、pimpl(头文件只暴露非虚接口并且class大小固定这样可以随意更新库文件,但会多一层间接性)
  • 基于闭包的编程:继承和多态可用std::function,std::bind来实现(闭包closure,可以将一个function对象绑定到任意对象的函数/函数上),包括设计模式中的接口,取代虚函数
  • 如果使用stdio,int64_t在32 64平台不是相同类型,需要包含inttypes.h并使用PRId64宏,如果使用iostream不需要考虑,但虚继承等效率低下。
  • iostream不是线程安全的,多个<< <<不保证原子性。不建议使用iostream,可以用stdio或者自己写针对性的操作函数

C++经验谈

  • 用异或交换变量是错误的,效率并没有增高,甚至低效,也降低了易读性
  • 不要重载全局::operator new(),去性能优化、检测内存错误、统计内存使用情况,这样第三方库无法保证同样的分配器。应替换malloc(),free()的实现
  • 除法取整有两种模式,向0取整,向负无穷取整,C++11/Java为向0,解释型语言部分是向负无穷
  • 单元测试mock可以使用设计时增加接口以多态实现(增加了虚影响效率)、编译期或链接期迟邦定-链接期垫片(通过namespace封装一套接口,利用namespace不封闭特性,可在不改变源文件情况下改动namespace的内容)
  • 慎用匿名namespace:匿名空间中的函数也是匿名的,需要引用的时候比较麻烦(调试时候,两个文件的匿名namespace中有相同名字的函数,无法区分是哪个);某些g++同一个文件的编译后二进制文件不同,可能是build tool失灵
  • 采用有利于版本管理的代码格式:合理使用换行符、多行注释用//(diff中可清晰看到大段注释的变化)、一行代码只定义一个变量、如果参数大于3个每个逗号后换行、class初始化列表也一行一个、namespace不缩进、避免使用版本控制软件的keyword substitution功能
  • 用对grep友好的代码风格(linux正则搜索命令):操作符不重载+-符号、用C++风格的cast进行类型转换

Techie亮博客,转载请注明:Coologic » 《Linux多线程服务端编程:使用muduo C++网络库》笔记(2)

Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
### 回答1: 《Linux多线程服务端编程使用muduo C++网络库》是一本介绍使用muduo C++网络库进行多线程服务端编程的电子书。该书由陈硕所著,适用于想要学习Linux多线程网络编程的开发人员。 本书从基础概念开始,详细介绍了多线程网络编程的原理和技术,并结合muduo C++网络库使用示例,演示了如何开发高性能、稳定的网络服务端程序。 muduo C++网络库是一个基于事件驱动的网络编程库,它采用了Reactor模式,提供了高效的异步IO操作。该库封装了多线程、多进程、事件等相关操作,使得开发者可以简单、快速地开发网络服务端应用。 在本书中,作者通过具体的实例和代码示例,讲解了muduo C++网络库使用方法和注意事项。书中内容分为多个章节,包括网络编程基础、IO复用、事件回调、线程同步、线程池等,涵盖了开发者在实际项目中可能遇到的各种情况。 通过学习《Linux多线程服务端编程使用muduo C++网络库》,读者可以了解到多线程服务端编程的基本原理和技术,掌握使用muduo C++网络库进行高效开发的方法,并能够开发出高并发、高性能的网络服务端应用。 总之,该书是一本实用的网络编程指南,对于想要学习Linux多线程网络编程以及使用muduo C++网络库的开发人员来说,具有较高的参考价值。 ### 回答2: 《Linux 多线程服务端编程使用 muduo C++ 网络库》是一本介绍如何使用 muduo C++ 网络库进行 Linux 多线程服务端编程的指南。该书主要目的是教读者如何构建高性能、可扩展的网络服务端应用程序。 该书首先介绍了多线程编程的基础知识,包括线程创建、线程同步与互斥、线程安全的数据结构等内容。然后,书中详细介绍了 muduo C++ 网络库使用方法,包括网络编程基础、事件驱动模型、网络编程的设计模式等。读者可以通过学习这些内容,了解如何使用 muduo C++ 网络库来构建高性能的多线程服务端。 该书还介绍了业界常用的网络协议及其实现原理,例如 TCP/IP、HTTP 协议等。通过学习这些知识,读者可以更好地理解网络编程的工作原理,从而更好地设计和实现自己的网络服务端应用程序。 此外,书中还涵盖了一些实际案例和实战经验,读者可以通过这些案例了解如何应对常见的网络编程问题,并且学习到一些实际的开发技巧和调试技巧。 总而言之,《Linux 多线程服务端编程使用 muduo C++ 网络库》是一本非常实用的指南,可以帮助读者快速入门多线程服务端编程,并且掌握使用 muduo C++ 网络库构建高性能的网络服务端应用程序的技巧。无论是初学者还是有一定网络编程经验的开发者,都可以从这本书中获得很多有价值的知识和经验。 ### 回答3: 《Linux 多线程服务端编程使用 muduo C++ 网络库》是一本关于使用muduo C++网络库进行Linux多线程服务端编程的书籍。本书以muduo C++网络库为基础,深入讲解了多线程服务端编程的相关知识和技巧。 本书主要内容包括: 1. muduo库的介绍:介绍了muduo库的特性、设计思想和基本用法。muduo库是基于Reactor模式的网络库,提供了高效的事件驱动网络编程框架,有助于开发者快速搭建高性能的网络服务端2. 多线程编程的基础知识:介绍了多线程编程的基本概念和相关的线程同步和互斥机制,如互斥锁、条件变量等。并讲解了如何正确地使用这些机制,以保证多线程程序的正确性和高效性。 3. muduo C++网络库使用:详细介绍了muduo库的线程模型、事件驱动机制和网络编程接口。通过实例代码和示意图,演示了如何使用muduo库构建一个多线程的网络服务端,包括创建监听套接字、事件的注册和处理、多线程任务分配等。 4. 高性能服务端的设计和优化:讲解了如何设计和优化高性能的多线程服务端。包括使用线程池提高并发处理能力、使用非阻塞IO提升数据处理效率、优化网络通信性能等方面的内容。 该书适合具有一定Linux编程基础的开发人员学习和参考。通过学习该书,读者可以掌握使用muduo C++网络库进行多线程服务端编程的技巧,提升服务端的性能和可靠性。同时,也可了解到网络编程领域的一些高级技术和最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值