C ++,结构和类构造函数中的C样式初始化列表

时间:2011-08-24 19:34:43

标签: c++ class list initialization

我还在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?是否有任何性能损失(即使它可以忽略不计)?

谢谢!

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中。