我还在C ++的启蒙之路上,所以请耐心等待......
假设我有一个结构:
struct MyThing
{
int a, b;
};
我想用c风格的速记创建一个,图1:
MyThing mt = { 1, 2 };
然后假设我决定在我的结构中的某个地方粘贴一个方法,并且(我是那种人)我觉得结构不适合方法,所以把它变成一个类:
class MyThing
{
public:
int a, b;
int sum()
{
return a + b;
}
};
我的图1仍然可以正常工作 - 一切都很笨拙。然后我决定我最终需要一个私有方法和成员:
class MyThing
{
private:
int c;
void swap() {
c = a;
a = b;
b = c;
}
public:
int a, b;
int sum()
{
return a + b;
}
};
此时,图1中的c风格初始化列表无法编译(无论如何在VS中)“非聚合不能用初始化列表初始化” - 这里很好地解释了这一点:http://msdn.microsoft.com/en-us/library/0s6730bb(v=vs.71).aspx < / p>
所以我切换到:
class MyThing
{
private:
void swap() {
int c = a;
a = b;
b = c;
}
public:
int a, b;
MyThing (int _a, int _b) : a(_a), b(_b) {}
int sum()
{
return a + b;
}
};
然后将图1改为(图2)
MyThing mt(1, 2);
Sooooo,毕竟,我的问题是:使用c风格的初始化列表(即它们更快吗?)创建东西有什么好处吗?或者它首先会做得如何:
struct MyThing
{
int a, b;
MyThing(int _a, int _b) : a(_a), b(_b) {}
};
从一开始就用它作为图2?是否有任何性能损失(即使它可以忽略不计)?
谢谢!
答案 0 :(得分:0)
使用c风格的初始化列表(即它们更快吗?)有什么好处来创建东西吗?
更快,更慢,真的重要吗?语法通常比调用构造函数更方便。这是C ++ 0x允许您对所有对象使用此语法的部分原因。
聚合初始化可能是免费的,作为编译时优化。编译器也可以优化简单的构造函数。要知道的唯一方法是查看生成的程序集。但除非你有实际的瓶颈,否则你不应该太在乎。
答案 1 :(得分:0)
嗯,首先,你说的例子失败了,事实上确实有效。 (在添加构造函数之前它不会失败)
现在,请记住,对象只是一块内存。因此
的二进制图像MyThing mt = { 1, 2 }; // Fig A
与
完全相同int mt[2] = { 1, 2}; // Fig B.
因此,为了实现图A或图B,编译器只需要发出:
mt DW 0x0001 Fig C
DW 0x0002
换句话说,零运行时成本。
但是,如果存在ctor,则必须运行(这是C ++承诺的合同的一部分)。 (不可避免的运行时成本)
类似地,私有成员,基类等会干扰处理编译时赋值所需的一对一对应关系,我们在图C中。