2016-11-18 82 views
0

我目前正在优化我的代码,我来到这里我很想初始化我上课的时候使用以下模式的一个点:呼叫在构造函数初始化列表非静态函数,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; 
}; 

我绝对理解使代码隐含地依赖于这样的初始化顺序是危险的,但是代码在其他方面是错误的?

请注意,上面的代码非常简化。我想这样做的原因是:

  1. 我想_collection标记为常量。
  2. functionThatDependsOnTheStateOfTheClass()是我的程序中最调用的函数之一(根据我的分析器),所以我宁愿不通过传递类的状态作为函数参数来创建开销。

所以我的问题是:我应该避免像瘟疫这样的模式,还是可以在某些情况下接受?

+0

在我看来,通过参数传递'x'是最好的方法。我不同意会有什么实际开销,你会惊讶于编译器优化器可以做什么,可能它会全部内联。 – Dai

+0

你确定*通过状态将是一个开销吗?请记住,传递'this'也是一个开销,并且可以通过'this'节省通过'this'进行间接访问的代价。显然,你会保留一个成员函数functionThatDependsOnTheStateOfTheClass,它只是用适当的参数调用一个重载。 –

+0

@Dai在我的示例代码中,所需的参数由一个int组成。然而,在我的真实代码中,有7个参数,其中两个参数需要通过引用传递,因为它们不是原始类型。你还认为他们会自动内联,没有任何开销? –

回答

3

现在你的代码已经很好的定义了。 The order of initialization of nonstatic data members of a class is

然后,非静态数据成员应在他们 在类定义中声明(再次不分先后顺序的MEM-初始化的 )的顺序进行初始化。

而且由于_x_collection_x将被初始化声明,因此可以在functionThatDependsOnTheStateOfTheClass()使用。

+1

同意。我认为在解释依赖关系的注释中(一个在函数中,另一个在成员变量附近,第三个用于构造函数),这会值得一些论文。但保持集合'const'而不杀死性能(并且不违反DRY)可能会使其值得。 –

相关问题