对于具有静态存储持续时间的对象,在编译期间可以将哪种构造函数应用为优化?

时间:2010-07-17 09:27:04

标签: c++ optimization compiler-construction constructor initialization

将以下两个类及其构造函数作为样本:

class One{
 public:
  One(int a,int b):adad1(a),adad2(b){}
 private:
  int adad1;
  int adad2;
};
class Two{
 public:
  Two(int input[]){
   for (int i=0;i<10;i++)
    araye[i]=input[i];
  }
 private:
  int araye[10];
};

考虑具有静态存储持续时间的对象,我认为第一个构造函数可以在编译期间应用,因为它的自由函数体允许它在某些情况下转换为常量表达式作为优化,但我怀疑第二个。无论如何,是否有任何规则指定在编译期间可以应用哪种构造函数?

2 个答案:

答案 0 :(得分:2)

在执行任何运行时代码之前,无法保证两者中的任何一个都是静态初始化的。首先,它很容易实现,但

class One{
 public:
  int adad1;
  int adad2;
};

// initialized statically, if a and b are constant-expressions
One one = { a, b }; 

正如另一个人所说,C ++ 0x中的constexpr允许构造函数静态执行。在你的情况下,这将适用于第一种情况,但不适用于第二种情况。你将不得不忍受第二次,标准不保证。但是标准仍然允许实现在静态初始化阶段进行优化。见3.6.2 / 2

  

允许实现使用静态存储持续时间作为静态初始化来执行命名空间作用域对象的初始化,即使这种初始化不需要静态完成,前提是

     
      
  • 初始化的动态版本不会更改任何其他命名空间对象的值   在初始化之前具有静态存储持续时间的范围,并且
  •   
  • 初始化的静态版本在初始化对象中产生的值与动态初始化产生的值相同,如果所有不需要静态初始化的对象都是动态初始化的。
  •   

如果给出的数组合适,您的构造函数可能不违反这些规则。标准显示了一个例子,我在more detail here中解释过。完成后,示例代码如下所示

inline double fd() { return 1.0; }
extern double d1;
double d2 = d1;   // unspecified:
                  // may be statically initialized to 0.0 or
                  // dynamically initialized to 1.0

double d1 = fd(); // may be initialized statically to 1.0

如您所见,如果变量之间存在某种关系,那么将事先初始化的内容甚至可以使用更改的初始值。

答案 1 :(得分:-1)

编译时没有应用构造函数。实际上,在编译时根本没有代码执行。