c++ - 对于具有静态存储持续时间的对象,在编译时可以应用哪些类型的构造函数作为优化?

标签 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];
};

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

最佳答案

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

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

An implementation is permitted to perform the initialization of an object of namespace scope with static storage duration as a static initialization even if such initialization is not required to be done statically, provided that

  • the dynamic version of the initialization does not change the value of any other object of namespace scope with static storage duration prior to its initialization, and
  • the static version of the initialization produces the same value in the initialized object as would be produced by the dynamic initialization if all objects not required to be initialized statically were initialized dynamically.

如果给定的数组是合适的,您的构造函数可能不会违反这些规则。该标准显示了一个示例,我在 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

如您所见,如果变量之间存在某种关系,则将要初始化的东西放在更早的位置甚至可以更改初始值。

关于c++ - 对于具有静态存储持续时间的对象,在编译时可以应用哪些类型的构造函数作为优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3270917/

相关文章:

sql - SQL 中的过早优化是否为 "evil",就像它在过程编程语言中一样?

java - 将数千行插入 mysql 数据库的最快方法?

javascript - 从 javascript 优化页面

c# - C# 编译器中的已知错误列表

c++ - 多次使用 [x, y, z, ...]-clause 语法,不应该允许 operator[] 接受多个参数吗?

C++ 编译时错误

parsing - 是否有一个简单的小语言编译器

c - 包含 C 中每个可能的构造的引用代码

c++ - 注册一个 C# COM 组件?

c++ - 在 c++ 对象包装器中安全包含 C 代码