使用聚合初始化列表比构造函数有优势吗?
-
05-09-2019 - |
题
我是 C++ 新手,我有一个问题......
我尝试通过制作测试应用程序来回答这个问题......在调试中,B类初始化生成较少的汇编代码,但在发布模式下,我真的不能说......它优化了初始化:(
假设我有两个课程:
class A
{
public:
int a, b, c, d;
A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
{
}
};
class B
{
public:
int a, b, c, d;
};
使用有什么好处吗
B b = {1, 2, 3, 4}
代替
A a = A(1, 2, 3, 4);
?
解决方案
我不知道的性能优势,但在一般使用构造是优选的。
这是因为与A,成员A,B,C,d可以由私人。因此,你得到的封装与你的一个办法,你不B的。
作为一个类的设计者,可以强制通过一个构造严格的使用和成员变量的分配。在你的B,类情况下,你不能。
因此,尽管你可能会在PERF的一个小提升,使用B,我敢打赌这是微不足道的,而且会通过无保护的类成员的潜在头痛被否定。
其他提示
有关一个全局对象和静态类成员,初始化列表不调用上运行时任何代码。 (初始化数据被直接存储在二进制)。
如果要初始化大量的对象,或如果构造代码是昂贵的/大,这可以使在加载时的显着差异。
如所述,这是真实的,只有用于普通老式的数据,即它可以与C ++ <0X
的初始化列表被初始化一切您不必使用这种类型的初始化的C工作++编写明确的构造和C代码。
如果你有复杂的简单数据的Fileds的化合物结构,变量初始化可以比与构造更容易初始化列表:
B barr[5] = {
{1,2,3,4},
{5,6,7,8},
...
};
这是(目前)只适用于简单的类,只有POD成员变量和程序员的缺点可能不是很熟悉的语法。
大多数类不能使用初始化列表(还),所以你最好使用构造函数只是要一致。 C ++ 0x中的std :: initializer_list将存在允许该语法的任何类。
以下是使用初始化列表的场景:
- 用于非静态 const 数据成员的初始化。
- 用于初始化参考成员。
- 用于初始化没有默认构造函数的成员对象。
- 用于基类成员的初始化。
- 当构造函数的参数名称与数据成员相同时。
不隶属于 StackOverflow