游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2627|回复: 6

初始列表的效率

[复制链接]

17

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-5-30 09:10:00 | 显示全部楼层 |阅读模式
Hi:
大家好,昨天在看书的时候,提到使用初始化语法形式可以来带效率上的优势,请问这个是根据什么对效率进行提高的。然后

  1. 头文件
  2. Public:
  3. CTest(const string& n, const string& a);
  4. string name;
  5. string address;

  6. 源文件
  7. CTest::CTest(const string& n, const string& a) : name(n)
  8. {
  9.         address = a;
  10. }
复制代码
书上说
这里的name用n的一个副本进行初始化。而在另一方面,对address将先用一个空串初始化,而后又用a的副本赋值

那请问,为什么name不需要空串的初始化,而address需要先用一个空串初始化呢?
谢谢

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2007-5-30 09:47:00 | 显示全部楼层

Re:初始列表的效率

name使用拷贝构造函数直接构造,address先无参构造(即先用空串初始化),再=操作。

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-5-30 14:41:00 | 显示全部楼层

Re:初始列表的效率

是不是, name 直接就赋值了, address 先要生成出来一个空的,再往这个位置填上实际的值

一个是在生成新对象的时候一步就完成,另一个是分两步完成的。 我这么理解对么?

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2007-5-30 14:50:00 | 显示全部楼层

Re:初始列表的效率

路过~~~~~~~~~

构造一个类A的对象时,会先调用类A的基类构造函数(如果有的话),以及类A包含的子对象构造函数(如果有的话)。因此,形如类:
class A
{
public:
    string data;
};

A::A()
{

}

即等价于:
A::A() : data() //这里可能不对
{
}

也就说,编译器会先使用默认构造构造一次data(因为data是一个子对象),如果你这样写:
A::A()
{
    data = "some string";
}
那么这里显然就多了一次你不想要的操作(函数调用开销),故效率不高。

所以,人们才建议,对于子对象最好在初始化列表里构造,因此,最好这样:
A::A() : data( "some string" )
{
}

17

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
 楼主| 发表于 2007-5-30 16:33:00 | 显示全部楼层

Re: Re:初始列表的效率

6spring: Re:初始列表的效率

name使用拷贝构造函数直接构造,address先无参构造(即先用空串初始化),再=操作。

哈哈,谢谢你的回复哦。但是还是不明白你说的啊。
你说的使用拷贝构造函数直接构造,是什么意思哦?哪个的拷贝构造函数?

17

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
 楼主| 发表于 2007-5-30 16:35:00 | 显示全部楼层

Re: Re:初始列表的效率

kevinlynx: Re:初始列表的效率

路过~~~~~~~~~

构造一个类A的对象时,会先调用类A的基类构造函数(如果有的话),以及类A包含的子对象构...

3Q,路过也这么热心哦!
那利用初始列表,列表中的项难道不是通过赋值的方式传递给成员变量的吗?那又是怎么回事呢?

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2007-5-30 20:15:00 | 显示全部楼层

Re:初始列表的效率

3楼的说的有理,在汇编代码上会少两次无用的MOV操作。
其实在疑惑时看看汇编就知道为什么了。构造的时候就赋值过去是最快的,否则编辑器会做很多无用功。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表