Improve Performance of C++ Codes (1) -- 使用初始化列表还是赋值语句?
条款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) -- 使用初始化列表还是赋值语句?相关推荐
- 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 ...
- 报错: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 ...
- 关于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 ...
- 微信小程序 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 ...
- 小程序警告: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 ...
- 微信小程序开发——消除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. ...
- 小程序提示报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 ...
- 小程序 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 ...
- 微信小程序报错 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 ...
最新文章
- c++ hook 钩子的使用介绍
- 发那科机器人注油_如何给发那科机器人做三年保养?干货!
- BZOJ 4174 tty的求助 莫比乌斯反演
- 使用OpenGL实现翻书动画
- CCNP中单区域OSPF详解(第一部分)
- 【scala】集和映射
- 2011年9月19日 面试重点:asp.net运行原理和生命周期
- Node Express4.x 片段视图 partials
- 大龄打工者的出路在哪里
- MVC与WebForm最大的区别
- php5.6获取文件名,PHP 5.6:headers_sent间歇性地返回true,空文件名和第0行
- 方便使用FFMPEG的经验
- 怎么用服务器跑matlab程序,服务器上跑matlab程序
- 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
- Symbian S60第三版软件精选介绍
- Google Colab 挂载 Google Drive
- C语言编程所得税计算,C语言个人所得税计算系统
- Unity3d打包程序报错NotSupportedException: Encoding 437 data could not be found.
- 数据格式化 string.format()
- Revit链接CAD
热门文章
- bootstrap 图标glyphicons图标符号不正常显示解决办法
- Android11 AMS的出生地到此一游
- we-color-picker 微信小程序拾色器(颜色选择器)组件
- odoo的api接口
- smartdraw2012破解教程
- EasySysprep5系统封装教程
- 【第9期】自动驾驶出租车到底“破坏力”几何?麦肯锡这份报告告诉你...
- 《Sony Vegas Pro 12标准教程》——导读
- Maya打造绝色东方含蓄美女详细教程,学会3D建模都能给自己做老婆了,你还在等什么呢?
- win2003 php配置文件,Win2003环境安装配置PHP - XingBin.net