Почему gcc уничтожает мой объект мгновенно, несмотря на его масштаб?(и как мне сделать так, чтобы это не делалось?) - PullRequest
2 голосов
/ 19 сентября 2011

Я написал небольшой класс профилирования с сопровождающим классом защиты, чтобы использовать его так:

{
    ProfileGuard pg("SampleName");

    // Code to profile
    ...
}

Но потом я заметил, что иногда gcc оптимизирует код так, что pg мгновенно уничтожается. Очевидно, он обнаруживает, что pg и другой код не будут влиять друг на друга. Как лучше всего помешать gcc сделать это?

Обновление: Поскольку у меня возникло серьезное недоверие к моему вопросу, я снова проверю свой код. Я основал свой вопрос на:

3.7.3 3.

Если переменная с автоматическим хранением имеет инициализацию или деструктор с побочными эффектами, она не должна быть уничтоженным до конца его блока, и при этом это не должно быть устранено как оптимизация, даже если это кажется быть неиспользованным, за исключением того, что объект класса или его копирование / перемещение могут быть удалены, как указано в 12.8.

Является ли печать "побочным эффектом"?

1 Ответ

10 голосов
/ 19 сентября 2011

Очевидно, он обнаруживает, что pg и другой код не будут влиять друг на друга.

Как, так как это явно не соответствует действительности?Они делают влияют друг на друга (например, через порядок вывода).

GCC не делает этого.Возможно, вы случайно использовали анонимный (и, следовательно, временный) объект?

ProfileGuard("SampleName");

Теперь этот будет разрушаться сразу после выполнения выражения.

...