EC27

本文深入探讨C++编程的关键实践,包括转型操作的正确使用、提高异常安全性、理解inlining的利弊及最小化编译依赖,旨在提升代码质量和效率。
27. 尽量少做转型动作
  • c++提供四种新式转型:

1)const_cast<T>(expression)——唯一可以移除对象常量性的c+±style转型操作符。

2)dynamic_cast<T>(expression)——决定某对象是否归属继承体系中的某个类型,“安全向下转型”。(就是将基类转型为继承类),实现版本执行速度相当慢,效率低。

3)reinterpret_cast<T>(expression)——低级转型

4)static_cast<T>(expression)——强迫隐式转换(例如转为const对象)

  • 使用新型转型有利于在代码中识别,并且其目标窄化,有利用编译器诊断出错误运用。

  • 类型转换并不是告诉编译器把某种类型视为另一种类型,其会令编译器编译出运行期间执行的代码。

总结

如果可以,应该避免转型;如果是注重效率的代码中,应该避免dynamic_casts.

28. 避免返回handles指向对象内部成分

handles包括引用、指针和迭代器,如果返回一个“代表对象内部数据”的handle,带来的就是降低对象封装性的风险。

对象内部指的是private或protected的成员变量或函数。

dangling handles指的是所指东西的所属对象不复存在。

总结:避免返回handles指向对象内部成分就是避免这种风险:有个handle被传出去了,那么就被暴露在handle比所指对象更长寿的风险下【eg:handles指向的对象到达了作用域然后被析构了,此时handles就指向了一个不复存在的对象了,变成dangling handles】。并还能增加封装性。

29. 为“异常安全”而努力是值得的
  • 异常安全性有两个条件:
    1)不泄露任何资源。(这个要注意new,malloc函数)——RAII解决。
    2)不允许数据败坏
  • 异常安全函数提供三个保证之一:
    1)基本承诺:异常抛出后,所有对象处于一种内部前后一致的状态,即数据没有被破坏。
    2)强烈保证:函数如果失败,则程序回复到“调用函数之前”的状态。
    3)nothrow保证:承诺不抛出异常,因为可以完成预期功能。eg:作用于内置类型(如int)的所有操作都提供nothrow保证。
  • 异常安全码必须提供三个保证之一。
  • “强烈保证”往往能以copy-and-swap实现出来,但其时间和空间效率低,一般不予采取。

总结:从条件和保证两方面进行考虑异常安全,从而检查自己写的函数是否实现异常安全。

30. 透彻了解inlining的里里外外
  • inline函数:看起来像函数,动作像函数,但调用时不会有额外开销,又比宏好的多,因为检查了参数类型。
  • 整体观念:对inline函数的每一个调用都以函数本体替换,这将会增加object code,造成代码膨胀。
  • 如果inline函数本体小,使本体替换比函数调用产出的码小,那效率更高。
  • inline函数的位置:通常一定被置于头文件,因为大多数编译环境在编译过程就进行inlining。
  • inline函数的约束:大部分编译器拒绝将太过复杂,如带有循环或递归的函数inlining,以及拒绝将virtual函数inlining,因为virtual以为直到运行期才知道用哪个函数。
  • 继承类的构造函数即使是个空,但是其也只是表面是个空,实际上其会先调用基类的构造函数,然后再调用成员变量类型的构造函数。
  • inlining函数不支持设立断点,所以不能进行调试。
  • inlining函数如果发生变化,那么就要重新编译,如果他不是inlining函数,那么重新链接即可。

总结:inlining函数也有很多约束和弊端,所以当且仅当函数体比较小型并被频繁调用时,我们才考虑使用inlining函数。

31. 将文件间的编译依存关系降至最低

1)即实现“接口与实现分离”。分离的关键在于以“声明的依存性”替换“定义的依存性”。其设计策略为:

  • 优先考虑使用object 引用或指针完成任务
  • 如果可以,尽量以class声明式替换class定义式
  • 为声明式和定义式提供不同的头文件

2)如果可以将提供class定义式从函数声明的头文件中转移到内含函数调用的客户文件,则可将“并非真正必要之类型定义”与客户端之间的殡仪依存性去除掉。

3)接口函数和实现函数的成员函数完全相同,两个接口完全相同。让接口类调用实现类的指针,从而使接口类变成一个handle class,不改变其做的事,而改变它做事的方法。

4)或者接口类中定义的全是纯虚函数,从而成为一个interface classes

总结:支持“编译依存性最小化”的一般构想是:相依于声明式,不相依于定义式。两个手段是handle classes和interface classes

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值