就提高程序的性能/效率而言,上层的平台/架构/算法/数据结构当然重要,然而也不能忽视代码本身的性能优化,即为了让编译器将你写的高级语言的代码翻译成尽量高效的机器代码,这方面也是我很感兴趣的领域,下面就记录一些improve performance of c++ codes的方方面面,希望从点滴做起,写出相对高效的c++codes。

条款1:
--------------------------------
Q:构造函数中使用初始化列表(Initialization list)还是赋值(Aassignment)来初始化成员?
A:尽量使用初始化列表。
--------------------------------

测试:
--------------------------------
(测试主要集中于在x86平台上的MS编译器,且是在开启编译器的最大优化功能的情况下,一般对应Release模式)
下面看个c++ test program:

//TestClass.h
class A
{
public:
    A();
    int i;
};

//TestClass.cpp
#include "TestClass.h"

A::A()
{
    i = 0;
}

//LGVector.h
#include "TestClass.h"

class LGVector
{
public:
    // constructor
    LGVector(){};
    LGVector(A a);

private:
    int i;
    A a;    
};

//LGVector.cpp
#include "TestClass.h"

// Initializaton list
LGVector::LGVector(A a) : a(a)
{
}

// Assignment
//LGVector::LGVector(A a) : a(a)
//{
//    a = a;
//}

//main.cpp
#include "LGVector.h"

int main(int argc, char* argv[])
{    
    A a1;
    a1.i = 10;

LGVector v1(a1);

return 0;
}

下面是LGVector构造函数的x86 Assembly codes:

初时化列表:(x86, VC++ 6.0, Release, Optimization: Maximize)

_a$ = 8
??0LGVector@@QAE@VA@@@Z PROC NEAR            ; LGVector::LGVector, COMDAT

; 14   : {

mov    eax, ecx
    mov    ecx, DWORD PTR _a$[esp-4]  // 不会调用A的构造函数
    mov    DWORD PTR [eax+4], ecx

; 15   : }

ret    4

赋值操作:(x86, VC++ 6.0, Release, Optimization: Maximize)

_a$ = 8
??0LGVector@@QAE@VA@@@Z PROC NEAR            ; LGVector::LGVector, COMDAT

; 7    : {

push    esi
    mov    esi, ecx
    push    edi
    lea    edi, DWORD PTR [esi+4]
    mov    ecx, edi
    call    ??0A@@QAE@XZ                ; A::A // 会调用A的构造函数,注意:并没有分配额外的内存来创

建额外的对象,只是将当前对象的的子对象a的指针(edi)传递到A:A()中,做一些初时化。performance的下降只在于A:A()的调用。

; 8    :     this->a = a;

mov    eax, DWORD PTR _a$[esp+4]
    mov    DWORD PTR [edi], eax

; 9    : }

mov    eax, esi
    pop    edi
    pop    esi
    ret    4

--------------------------------

小结:
--------------------------------
VC++ 6.0下:
在构造函数中,推荐使用初时化列表来初始化成员,可以避免成员的构造函数的调用,提高performance,但只针对
non built-in/instinctive types,因为built-in/instinctive types没有构造函数。

在VC++2005:
貌似两者performance一样,赋值操作来初始化成员也不会调用成员的构造函数。

--------------------------------

转载于:https://www.cnblogs.com/soroman/archive/2008/04/05/1138100.html

Improve Performance of C++ Codes (1) -- 使用初始化列表还是赋值语句?相关推荐

  1. uniapp开发微信小程序时,报错:Now you can provide attr `wx:key` for a `wx:for` to improve performance

    前言 os :win10 HBuilder X :2.7.14.20200618 微信开发者工具 win32 :1.03.2006090 问题 每当使用微信开发者工具预览小程序时,均会在控制台(Con ...

  2. 报错:Now you can provide attr `wx:key` for a `wx:for` to improve performance

    文章目录 问题 报错 解决办法 问题 在小程序开发时出现缺少wx:key的错误 报错 Now you can provide attr wx:key for a wx:for to improve p ...

  3. 关于Now you can provide attr wx:key for a wx:for to improve performance.

    在实际开发过程中遇到 warning: Now you can provide attr "wx:key" for a "wx:for" to improve ...

  4. 微信小程序 Now you can provide attr `wx:key` for a `wx:for` to improve performance.

    微信小程序用到"wx:for"时可能会在控制台报"Now you can provide attr "wx:key" for a "wx:f ...

  5. 小程序警告:Now you can provide attr `wx:key` for a `wx:for` to improve performance.

    文章目录 问题 解析 解决 示例 问题 当我们在使用wx:for遍历列表数据的时候,可能会遇到以下警告: Now you can provide attr `wx:key` for a `wx:for ...

  6. 微信小程序开发——消除Now you can provide attr `wx:key` for a `wx:for` to improve performance.

    在开发微信小程序的是遇到了WXML Runtime warning:Now you can provide attrwx:key for awx:forto improve performance. ...

  7. 小程序提示报Now you can provide attr wx:key for a wx:for to improve performance.

    如果小程序里面你发现自己哪里都没写错,却提示以下内容, Now you can provide attr "wx:key" for a "wx:for" to ...

  8. 小程序 Now you can provide attr wx:key for a wx:for to improve performance.

    在wxml中添加: <view wx:for="{{array}}" > {{item}} </view> 报错: VM4222:2 ./pages/ind ...

  9. 微信小程序报错 Now you can provide attr `wx:key` for a `wx:for` to improve performance.

    出现黄色警告Now you can provide attr wx:key for a wx:for to improve performance.不影响运行效果 只需要在 wx:for 后面添加 w ...

最新文章

  1. c++ hook 钩子的使用介绍
  2. 发那科机器人注油_如何给发那科机器人做三年保养?干货!
  3. BZOJ 4174 tty的求助 莫比乌斯反演
  4. 使用OpenGL实现翻书动画
  5. CCNP中单区域OSPF详解(第一部分)
  6. 【scala】集和映射
  7. 2011年9月19日 面试重点:asp.net运行原理和生命周期
  8. Node Express4.x 片段视图 partials
  9. 大龄打工者的出路在哪里
  10. MVC与WebForm最大的区别
  11. php5.6获取文件名,PHP 5.6:headers_sent间歇性地返回true,空文件名和第0行
  12. 方便使用FFMPEG的经验
  13. 怎么用服务器跑matlab程序,服务器上跑matlab程序
  14. 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
  15. Symbian S60第三版软件精选介绍
  16. Google Colab 挂载 Google Drive
  17. C语言编程所得税计算,C语言个人所得税计算系统
  18. Unity3d打包程序报错NotSupportedException: Encoding 437 data could not be found.
  19. 数据格式化 string.format()
  20. Revit链接CAD

热门文章

  1. bootstrap 图标glyphicons图标符号不正常显示解决办法
  2. Android11 AMS的出生地到此一游
  3. we-color-picker 微信小程序拾色器(颜色选择器)组件
  4. odoo的api接口
  5. smartdraw2012破解教程
  6. EasySysprep5系统封装教程
  7. 【第9期】自动驾驶出租车到底“破坏力”几何?麦肯锡这份报告告诉你...
  8. 《Sony Vegas Pro 12标准教程》——导读
  9. Maya打造绝色东方含蓄美女详细教程,学会3D建模都能给自己做老婆了,你还在等什么呢?
  10. win2003 php配置文件,Win2003环境安装配置PHP - XingBin.net