Ранняя динамическая инициализация C ++ [дубликат]

  1. Проверьте версию установленного браузера Chrome.
  2. Загрузите совместимую версию ChromeDriver с https://sites.google.com/a/chromium.org/chromedriver/
  3. Установите местоположение совместимого ChromeDriver на:
    System.setProperty("webdriver.chrome.driver", "C:\\Users\\your_path\\chromedriver.exe");
    
  4. Запустите тест еще раз.
  5. Должно быть хорошо Теперь.

4
задан xskxzr 11 June 2016 в 06:03
поделиться

1 ответ

Статическая инициализация выполняется во время компиляции / компоновки. Компилятор / компоновщик назначает местоположение переменной в статической памяти и заполняет ее правильными байтами (байты не обязательно должны быть всеми нулями). Когда программа запускается, те области статической памяти загружаются из двоичного файла программы, и дальнейшая инициализация не требуется.

Примеры:

namespace A {
    // statically zero-initialized
    int a;
    char buf1[10];

    // non-zero initialized
    int b = 1;
    char date_format[] = "YYYY-MM-DD";
}

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

Примеры:

namespace B {
    int a = strlen(A::date_format);   (1)
    int b = ++a;                      (2)

    time_t t = time();                (3)

    struct C {
        int i;

        C() : i(123) {}
    };

    C c;                              (4)

    double s = std::sqrt(2);          (5)
}

Теперь стандарт C ++ позволяет компилятору выполнять вычисления, которые выполняться во время динамической инициализации при условии, что эти вычисления не имеют побочных эффектов. Кроме того, эти вычисления не должны зависеть от внешней среды. В приведенном выше примере:

(1) может выполняться статически, поскольку strlen() не имеет побочных эффектов.

(2) должен оставаться динамическим, поскольку он мутирует a.

(3) должен оставаться динамическим, поскольку он зависит от внешней среды / делает системные вызовы.

(4) может выполняться статически.

(5 ) немного сложнее, поскольку вычисление с плавающей запятой зависит от состояния FPU (а именно, режима округления). Если компилятору предлагается не относиться к арифметике с плавающей запятой, что серьезно, тогда это можно сделать статически.

1
ответ дан Leon 19 August 2018 в 11:17
поделиться
  • 1
    Спасибо за Ваш ответ. Итак, в вашем примере, если c инициализируется статически, будет ли пропущен конструктор, когда c.i установлен равным 123? Если это так, в соответствии с первым абзацем в [class.cdtor]: «Для объекта с нетривиальным конструктором, ссылаясь на любой нестатический член или базовый класс объекта до того, как конструктор начинает выполнение, результат приводит к неопределенному поведению & quot; , любой дальнейший доступ к ci в вашем примере приведет к неопределенному поведению, хотя он имеет четкое значение 123, как невероятно! Или есть некоторые ошибки в вышеупомянутом анализе? – xskxzr 11 June 2016 в 08:28
  • 2
    Для примера кода конструктор можно считать выполненным, поскольку его единственным эффектом является установка c.i в 123. Тот факт, что компилятор несколько перестроил то, как это было сделано, - это просто деталь реализации. – Leon 11 June 2016 в 08:40
  • 3
    Что, если существуют побочные эффекты? [basic.start.static / 3], похоже, не требует никаких побочных эффектов. – xskxzr 11 June 2016 в 09:07
  • 4
    & quot; не изменяет значение любого другого объекта & quot; как это относится к побочным эффектам – Leon 11 June 2016 в 10:03
Другие вопросы по тегам:

Похожие вопросы: