【发布时间】:2011-11-03 02:49:39
【问题描述】:
我还在 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 仍然可以正常工作 - 一切都很好。然后我决定我最终需要一个私有方法和成员:
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 中),“non-aggregates cannot be initialized with initializer list” - 这里很好解释: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);
太棒了,毕竟,我的问题是:使用 c 风格的初始化列表(即它们更快吗?)来创建东西有什么好处吗?还是一开始也一样好:
struct MyThing
{
int a, b;
MyThing(int _a, int _b) : a(_a), b(_b) {}
};
并从一开始就将其用作图2?是否有任何性能影响(即使可以忽略不计)?
谢谢!
【问题讨论】:
-
“它们更快吗” - 我建议使用最自然的方法,并且只有在您真正遇到瓶颈时才担心更快。如果你在一个紧密的循环中这样做,那么可能还有其他问题......
-
答案是“不”,它们并不比正确的初始化列表快。
-
@Mooing Duck - 这大致是我得出的结论 - 虽然用速记创建东西可以节省打字,但当它们嵌套时(即嵌套的 POD 结构),快速阅读会变得非常可怕- 而不是有构造函数,唯一的额外输入是类名(并且使用 () 而不是 {}) - 发生了什么更清楚:) 现在我也同意 awoodland - 如果它成为一个问题,请担心性能;如果我担心性能,我不太可能会创建很多很多不同的实例......谢谢你的回答:)
-
我觉得我应该补充一下(作为我对性能的疑问的原因)我在过去 5 年里一直是一名 Java 开发人员; 1 个月后,我将搬到一家 C++ 游戏公司——这对我来说是全新的! :)
标签: c++ class list initialization