我目前正在优化我的代码,我来到这里我很想初始化我上课的时候使用以下模式的一个点:呼叫在构造函数初始化列表非静态函数,C++
class MyClass
{
MyClass(int x) :
_x(x),
_collection(createCollection())
{
}
int functionThatDependsOnTheStateOfTheClass() const
{
return _x;
}
private:
std::vector<int> createCollection() const
{
std::vector<int> collection;
// The collection is dependent on _x somehow.
collection.push_back(functionThatDependsOnTheStateOfTheClass());
return collection:
}
const int _x;
const std::vector<int> _collection;
};
我绝对理解使代码隐含地依赖于这样的初始化顺序是危险的,但是代码在其他方面是错误的?
请注意,上面的代码非常简化。我想这样做的原因是:
- 我想_collection标记为常量。
- functionThatDependsOnTheStateOfTheClass()是我的程序中最调用的函数之一(根据我的分析器),所以我宁愿不通过传递类的状态作为函数参数来创建开销。
所以我的问题是:我应该避免像瘟疫这样的模式,还是可以在某些情况下接受?
在我看来,通过参数传递'x'是最好的方法。我不同意会有什么实际开销,你会惊讶于编译器优化器可以做什么,可能它会全部内联。 – Dai
你确定*通过状态将是一个开销吗?请记住,传递'this'也是一个开销,并且可以通过'this'节省通过'this'进行间接访问的代价。显然,你会保留一个成员函数functionThatDependsOnTheStateOfTheClass,它只是用适当的参数调用一个重载。 –
@Dai在我的示例代码中,所需的参数由一个int组成。然而,在我的真实代码中,有7个参数,其中两个参数需要通过引用传递,因为它们不是原始类型。你还认为他们会自动内联,没有任何开销? –