c++中的C风格初始化列表、结构和类构造函数

C-style initialization lists in C++, structs, and class constructors

本文关键字:结构 构造函数 列表 中的 风格 初始化 c++      更新时间:2023-10-16

我还在学习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;
    }
};

在这一点上,c风格的初始化列表在图1中的编译失败(无论如何在VS中)"非聚合不能初始化与初始化列表"-这是很好的解释在这里:http://msdn.microsoft.com/en-us/library/0s6730bb(v=vs.71).aspx

所以我改成:

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;
    }
};

则将Fig.1改为(Fig.2)

MyThing mt(1, 2);

Sooooo,在所有这些之后,我的问题是:使用c风格的初始化列表是否有任何好处(即它们更快吗?)创建东西?或者,如果一开始就有:

struct MyThing
{
    int a, b;
    MyThing(int _a, int _b) : a(_a), b(_b) {}
};

从一开始就用作图2吗?是否有任何性能影响(即使可以忽略不计)?

谢谢!

首先,你所说的失败的例子,实际上是有效的。(它不会失败,直到你添加构造函数)

现在,请记住,对象只是内存的一部分。因此

的二值图像
MyThing mt = { 1, 2 };        // Fig A

完全相同
int  mt[2] = { 1, 2};         // Fig B.
因此,要实现图A或图B,编译器只需要发出:
mt    DW      0x0001        Fig C
      DW      0x0002

也就是说,零运行时成本。

然而,如果存在一个actor,那么它必须被运行(这是c++约定的一部分)。(不可避免的运行时间成本)

类似地,私有成员、基类等也会干扰处理编译时赋值所需的一对一对应关系,如图c所示。

是否有使用c风格的初始化列表的任何好处(即,他们是更快?)创建的东西?

快,慢,真的重要吗?在语法上,它通常比调用构造函数方便得多。这就是c++ 0x允许对所有对象使用这种语法的部分原因。

聚合初始化可能是免费的,作为编译时优化。编译器也有可能优化简单的构造函数。唯一的方法是查看生成的程序集。但除非你真的遇到瓶颈,否则你不应该太在意。