优化相关

  • 使用灵活的、动态分配的数据,不要使用固定大小多数组;
  • 优先使用线性算法或者尽可能快的算法:

    1. push_back 散列表查询:O(1)
    2. set/map lower_bound/upper_bound: O(logN)
    3. vector::insert for_each O(N)
  • 尽可能避免劣于线性复杂性的算法,永远不要使用指数复杂性的算法;

  • 不要进行不成熟的优化:
    1. 可以用通过引用传递的时候,却定义了通过值传递的方式传递参数;
    2. 可以使用前缀++、--运算的时候,却使用了后缀的方式;
    3. 构造函数中使用赋值操作而非初始化列表

并发编程

  • 尽量减少全局和共享数据
    避免使用名字空间作用域中具有外部连接的数据或者作为静态类成员的数据。如果不得不用,一定要对其仔细进行初始化。在不同编译单位中这种对象的初始化顺序是未定义的,为此需要高度注意;另外,名字空间作用域中的对象、静态数据成员对象或者跨线程(进程)共享的对象会减少并行性,往往是产生性能和可伸缩性瓶劲的原因。

例外情况: cin/cout/cerr 比较特殊: cout << "hello world" 等价于
(cout, "hello world");

  • 使用C++编写可靠的多线程的代码,认真考虑下面的建议:

    1. 参考目标平台的文档,了解改平台的同步原语,比如原子操作、内存屏障
    2. 最好将平台的原语用自己设计的抽象包装起来:比如使用pthread;
    3. 确保正在使用的类型在多线程程序中使用是安全的:
      保证非共享的对象独立;
      确定在不同线程中使用该类型的同一个对象到底是不是需要加锁、考虑最合适的加锁粒度;
  • 如果编写可能用于多线程的类型,必须完成两项任务:

    1. 确保不同线程可以不加锁地使用该类型的不同对象;
    2. 必须明确且提供不同线程使用该类型的同一个对象需要做的操作:
      是否需要考虑外部加锁: 调用者自己负责加锁
      是否需要内部加锁:为每个公有成员函数的操作加锁。比如生产者-消费者模型通常使用内部加锁。需要考虑:
      第一、 确认该类型的对象总是要被跨线程共享;
      第二、类型接口的设计应该有利于粗粒度、自给自足的操作。如果内部的锁加得很合适,那么对调用者而言是透明无感的。
      第三、不变对象(只读的、常量字符串)不需加锁。
  • 确保资源为对象所拥有,使用显式的RAII和智能指针
    1. 使用RAII时,小心复制构造函数和赋值构造函数;
    2. 使用智能指针而非原始指针来保存动态分配的资源:shared_ptr<T *>
    3. 应该显式地执行资源分配(比如new);
    4. 马上将申请分配的资源赋予给管理对象:

比如:
void Fun(shared_ptr<Widget> sp1, shared_ptr<Widget> sp2);
Fun(shared_ptr<Widget>(new Widget), shared_ptr<Widget>(new Widget));

由于参数初始化的顺序可能因为编译器的不同而改变,一种极端的情况是:
同时执行了对两个对象的new 操作的内存分配操作,然后再试图调用两个Widget 构造函数。如果这个时候某个构造函数调用抛出异常,另外一个对象的内存就永远没有机会释放了。

解决方法:绝对不要在一条语句中分配一个以上的资源,应该显式地执行资源分配(比如new),然后马上将申请分配的资源赋予给管理对象。例如:

shared_ptr<Widget> sp1(new Widget);
shared_ptr<Widget> sp2(new Widget);

Fun(sp1, sp2);

C++ 进阶笔记之一的更多相关文章

  1. Angularjs进阶笔记(2)-自定义指令中的数据绑定

    有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊到底怎么用这个话题. 一. 自定义指令 自定义指令,是Angularjs用来实 ...

  2. javascript进阶笔记(2)

    js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用.在js中,我们通常要大量使用函数式编程风格.函数式编程专注于:少而精.通常无副作用.将函数作为程序代码的基础构件块. 在函 ...

  3. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  4. Android进阶笔记:AIDL内部实现详解 (二)

    接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...

  5. javascript进阶笔记(1)

    学习js已经有一段时间了,大大小小还是能够做出一些东西来.不过觉得可惜的是,还是对js本身这门语言不是很熟悉,总有一点雾里看花的感觉,看得见,但是看不清楚.最近发现有一本关于js的叫做<忍者秘籍 ...

  6. object - c 语言基础 进阶笔记 随笔笔记

    重点知识Engadget(瘾科技)StackOverFlow(栈溢出)Code4Apprespon魏先宇的程序人生第一周快捷键: Alt+上方向键 跳到最上面  Alt+下方向键 跳到最下面      ...

  7. python进阶笔记 thread 和 threading模块学习

    Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁.threading基于Java的线程模型设计.锁(Lock)和条件变 ...

  8. Android进阶笔记20:Android手机屏幕坐标系

    1. 手机屏幕坐标系: 整个坐标系是以手机屏幕左上角为原点(0,0),如下:

  9. Android进阶笔记19:onInterceptTouchEvent、onTouchEvent与onTouch

    1.onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法,处理View及其子类被touch是的事件处理.当一个View绑定了OnTouchLister后, ...

  10. Android进阶笔记18:选用合适的IPC方式

    1. 相信大家都知道Android进程间通信方式很多,比如AIDL.Messenger等等,接下来我就总结一下这些IPC方式优缺点. 2. IPC方式的优缺点和适用场景 3. 附加:使用Intent实 ...

随机推荐

  1. go基础之不定参函数

    指定类型参数 任意类型参数的变参 go语言同其他编程一样也提供了对变参函数的支持.本文简单讲解一下go中变参函数的使用方法. 指定类型参数 不定参数是指函数传入参数的个数为不确定数量,个数需要在调用的 ...

  2. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  3. jQuery中操作页面的文本和值

    主要是区分俩种方法: 1.html():可以识别HTML文件,将里面内容全部打印(操作双标签) 2.text():只是将里面的内容打印出来,不能识别HTML格式(操作双标签) <!DOCTYPE ...

  4. ASE19团队项目beta阶段Backend组 scrum6 记录

    本次会议于12月12日,19:30在微软北京西二号楼sky garden召开,持续10分钟. 与会人员:Zhikai Chen, Lihao Ran, Xin Kang 请假人员:Hao Wang 每 ...

  5. 洛谷 题解 P1372 【又是毕业季I】

    这题... 只能说:n / k罢了... 但是: 代码没有最短,只有更短! #include <stdio.h> int n, k; int main() { return scanf(& ...

  6. 从零开始openGL——三、模型加载及鼠标交互实现

    前言 在上篇文章中,介绍了基本图形的绘制.这篇博客中将介绍模型的加载.绘制以及鼠标交互的实现. 模型加载 模型存储 要实现模型的读取.绘制,我们首先需要知道模型是如何存储在文件中的. 通常模型是由网格 ...

  7. MySQL InnoDB 存储引擎原理浅析

    注:本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍<MySQL技术内幕++InnoDB存储引擎>,本文章仅记录个人认为比较重要的部分,有兴趣的可以花点时间读原书. 一.MyS ...

  8. 笔记||Python3之对象的方法

    什么是对象的方法? python中的一切类型的数据都是对象. 对象:数据和方法 对象数据:如 a = 'sfd' 对象方法:其实就是属于该对象的函数 对象的方法调用:对象.方法 字符串对象常用的方法: ...

  9. windows下安装ssdb

    官方下载 http://ssdb.io/docs/install.html 这是官方网站 官方建议 Do not run SSDB server on Windows system for a pro ...

  10. 28. 实现strStr() (双指针)

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...