Какие типы конструкторов могут применяться во время компиляции в качестве оптимизации для объектов со статической продолжительностью хранения? - PullRequest
1 голос
/ 17 июля 2010

взять два следующих класса и их конструкторы в качестве примеров:

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 ]

2 голосов
/ 18 июля 2010

Нет никакой гарантии, что какой-либо из двух статически инициализируется перед выполнением любого кода времени выполнения.Во-первых, это легко сделать, хотя

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

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

Как говорит другой парень, constexpr в C ++ 0x позволяет конструкторам выполняться статически.В вашем случае это будет работать для первого случая, но не для второго.Во-вторых, вам придется жить так, что Стандарт не дает никаких гарантий.Но стандарт все же позволяет реализации оптимизировать его на этапе статической инициализации.См. 3.6.2 / 2

Реализация может выполнять инициализацию объекта области пространства имен со статической продолжительностью хранения в качестве статической инициализации, даже если такая инициализация не требуется выполнять статически, при условиичто

  • динамическая версия инициализации не изменяет значение любого другого объекта области пространства имен со статической продолжительностью хранения до его инициализации, а
  • статическая версия инициализациивыдает то же значение в инициализированном объекте, что и динамическая инициализация, если все объекты, которые не требуется статически инициализировать, динамически инициализируются.

Если данный массив подходит, ваш конструкторне может нарушать эти правила.Стандарт показывает пример, который я объяснил в более подробно здесь .Для завершения пример кода показан ниже

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

Как видите, размещение объектов, которые должны быть инициализированы ранее, может даже идти с измененными начальными значениями, если существует определенная связь между переменными.

0 голосов
/ 17 июля 2010

Конструктор не применяется при компиляции. Фактически, никакой код вообще не выполняется во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...