C++升级之整洁之道(四)——相关技巧

1.智能指针

  资源申请即初始化是帮助我们安全处理资源的术语,也被称为“构造时获得,析构时释放”。
  std::unique_ptr< T >是具有独占所有权的,即一个对象一次智能由std::unique_ptr< T >的一个实例拥有。std::shared_ptr< T >是共享所有权的,可以指向T类型的一个对象,也可以与std::shared_ptr< T >的其他实例共享这个所有权。std::shared_ptr< T >是可以拷贝的,而std::unique_ptr< T >不能,也可以使用std::move< T >来移动指向的资源。std::weak_ptr< T >是可以无所有权但是能够安全访问的。

using ResourceTypePtr = std::unique_ptr<ResourceType>;
using ResourceVector = std::vector<ResourceTypePtr>;
std::unique_ptr<ResourceType> resource{std::make_unique<ResourceType>()};//auto resource{std::make_unique<ResourceType>()};避免显示的new和delete

  从C++11开始,标准库提供了便于使用的、不同的和高效的智能指针的实现。这些智能指针是几乎没有bug的。智能指针减少了内存泄露的可能性,此外,它们被设计成是线程安全的。随着C++11标准的发布,std::auto_ptr< T >已被标记为“弃用”,并且不再使用。在最新的C++1标准中,这个智能指针模板类已经从C++语言中删除了。这个智能指针的实现不支持rvalue引用和Move语义,并且也不能存储的到STL的容器中。std::unique_ptr< T >是std::auto_ptr< T >的完美代替者。
  在C++中不允许定义std::unique_ptr< void >类型,因为std::unique_ptr< T >没有实现类型删除,如果一个类支持类型删除,也就意味着它可以存储任意类型的对象,而且会正确释放对象占用的内存。
  对于内存管理,尽可能使用栈内存,用make function在堆上分配内存,尽量使用容器,如果由特殊的内存管理,利用特有的第三方库封装资源。

2.Move语义

  Move语义是指只移动对象的负载,即对象的数据,例如数据成员或原始数据类型。相对于拷贝运算,move操作运算符效率高得多,元对象数据只是传递给了目标对象,而用于操作的参数(原对象)被置于一种“空”或者原始的状态。

Clazz() noexcept;//默认构造函数
Clazz(const Clazz& other); //复制构造函数
Clazz(Clazz&& other) noexcept;//move 构造函数
Clazz& operator=(const Clazz& other);//拷贝构造函数
Clazz& operator=(Clazz&& other) noexcept;//move 赋值运算符
virtual ~Clazz() noexcept;//析构函数

  不要滥用Move,从C++11开始,所有的标准库容器都支持move语义。

3.编译时计算

  高性能计算经常使用静态、恒定的表来分隔数据和代码,希望在编译时尽可能多地进行计算,任何能在编译阶段计算或明确的事情,都没有必要等到程序运行时再完成。但是编译代码所需的时间或多或少的在增加。常量表达式说明符constexpr使得在编译时计算出函数或变量的值成为可能。

4.如何提高团队的代码质量

(1)要熟练使用 < a l g o r i t h m > {<algorithm>} <algorithm>和Boost库。还要有恰当的异常和错误处理机制。

(2)拥有恰当的异常和错误处理机制:
  所谓的横切关注点是指难以用模块化概念解决的问题,通常用软件架构和设计来解决。其中一个就是安全问题,必须在软件中处理数据安全和访问权限的问题,另一个是事务处理,特别是软件中数据库的应用,必须保证所谓的事务(一连串的单个操作)要么成功,要么作为一个完整的单元失败,不能只完成部分。日志也是一个横切关注点异常和错误处理是另一个横切关注点,对错误和不可预测异常的特殊处理及响应进行处理。
  前置条件在函数或者类的方法调用之前总为真,不变式只在函数调用过程必须是条件总为真,后置条件是指函数执行结束立刻返回真。异常安全背后的思想是客户端调用提供了不变式、后置条件、抛异常、不抛异常四种异常安全级别。
  无异常安全是最低安全级别,完全保证不了任何事情,代码永远不应该提供这个级别的异常安全。至少保证基本异常安全基本,如果调用函数过程发生了异常,保证无资源泄露,所有不变式保证不变,不会有数据或者内存损坏。强异常安全是指数据内容完全恢复到调用函数或方法之前一样。
  在任何情况下类的析构函数必须保证不抛出异常;Move操作应该保证不抛出异常;默认构造函数最好不抛出异常;函数的返回值不应该返回nullptr。如果异常导致不能恢复则尽快退出。
  注意catch的正确顺序,值类型抛出,常量引用类型捕获。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值