Построение и уничтожение локальных переменных с участием оптимизатора - PullRequest
5 голосов
/ 10 марта 2011

Если у меня есть этот код:

class A { ... };
class B { ... };

void dummy()
{
    A a(...);
    B b(...);
    ...
}

Я знаю, что переменные a и b будут уничтожены в обратном порядке распределения (сначала будет уничтожено b, затем a); но могу ли я быть уверен, что оптимизатор никогда не поменяет местами размещение и конструкцию a и b? Или я должен использовать volatile для обеспечения его соблюдения?

Ответы [ 3 ]

6 голосов
/ 10 марта 2011

Единственными гарантиями является то, что любые наблюдаемые побочные эффекты (то есть чтение и запись volatile объектов и вызовы функций ввода / вывода) конструкции a произойдут до того, как наблюдаемые побочные эффекты конструкцииb, и любые побочные эффекты a, требуемые b, произойдут до того, как они понадобятся.

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

3 голосов
/ 10 марта 2011

Единственное, в чем вы можете быть уверены, это то, что построение и распределение a будут раньше b. Пока вы разделяете свои операторы с помощью ;, они будут выполняться по порядку, независимо от оптимизации.

volatile не изменит того, что мешает компилятору кэшировать значения между доступами.

0 голосов
/ 10 марта 2011

Хорошо, я нахожу такие утверждения стандартными, но меня немного смущает ответ другого.

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

Это только гарантирует, что вызов функции не чередуется друг с другом, но функции имеют неопределенную последовательность, что означает, что

Оценки A и B имеют неопределенную последовательность, когда последовательность A либо перед B, либо B перед A, но не определено, какая.

...