c++中的C风格初始化列表、结构和类构造函数
C-style initialization lists in C++, structs, and class constructors
我还在学习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允许对所有对象使用这种语法的部分原因。
聚合初始化可能是免费的,作为编译时优化。编译器也有可能优化简单的构造函数。唯一的方法是查看生成的程序集。但除非你真的遇到瓶颈,否则你不应该太在意。
相关文章:
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 嵌套的模板结构构造函数实现
- 其他结构中的结构构造函数
- CPP/C 中的常量用法和结构构造函数中的澄清
- 聚合结构构造函数
- 结构构造函数调用不明确
- 关于结构构造函数和析构函数行为-C++
- 带有指针的C++结构:构造函数和析构函数
- 结构构造函数导致堆栈溢出的问题
- C++结构构造函数和函数冲突
- 嵌套结构构造函数和并集的问题
- C++结构构造函数
- 调用结构构造函数后初始化的值是什么
- 在结构构造函数中使用"this"关键字编译错误?-C++
- 这可能吗?在 C# 中调用托管 c++ 结构构造函数
- C++ - 结构构造函数,尝试取消指向结构的指针时出现重定义错误
- C++结构构造函数错误
- 结构构造函数语法
- 结构构造函数错误,为什么使用默认构造函数会调用错误
- Qt 将 QString 传递给结构构造函数不起作用