我仍在 C++ 的启蒙之路上,所以请耐心等待...
假设我有一个结构:
struct MyThing
{
int a, b;
};
我想用 c 风格的速记创建一个,图 1:
MyThing mt = { 1, 2 };
然后假设我决定在我的结构中的某个地方添加一个方法,并且(作为我这样的人)我觉得结构并不真正适合方法,所以把它变成一个类:
class MyThing
{
public:
int a, b;
int sum()
{
return a + b;
}
};
我的 Fig.1 仍然工作正常 - 一切都很好。然后我决定我最终需要一个私有(private)方法和成员:
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
所以我切换到:
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?是否有任何性能影响(即使可以忽略不计)?
谢谢!
最佳答案
好吧,首先,你说的例子失败了,但实际上确实有效。 (在添加构造函数之前它不会失败)
现在,请记住,对象只是一段内存。因此
的二进制图像MyThing mt = { 1, 2 }; // Fig A
与
完全一样int mt[2] = { 1, 2}; // Fig B.
因此,要实现图 A 或图 B,编译器只需发出:
mt DW 0x0001 Fig C
DW 0x0002
换句话说,零运行时成本。
但是,如果存在构造函数,则它必须 运行(这是 C++ promise 的契约的一部分)。 (不可避免的运行时成本)
同样,私有(private)成员、基类等会干扰处理编译时分配所需的一对一对应关系,我们在图 C 中有。
关于c++ - C++、结构和类构造函数中的 C 风格初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7181210/