В настоящее время это не проблема, но я обеспокоен, переносится ли код или мы меняем компиляторы.
У меня есть код с блоком
{
MyClass myObj;
// copy some other variables but never touch myObj
.
.
} // expect destructor to be called on myObj
где myObj никогда не используется в коде блока, но конструктор имеет побочный эффект, и я полагаюсь на код деструктора MyClass, который будет выполнен при закрытии блока. Это работает, как и ожидалось, на моем текущем компиляторе arm с включенной оптимизацией.
Мой вопрос: есть ли что-то, что мне нужно сделать, например, объявить что-то изменчивое или задать какой-либо общий атрибут, чтобы оптимизатор не обнаруживал myObj как неиспользуемую переменную или что-то подобное.
Это не компилятор C ++ 11. Как я уже сказал, в настоящее время это не проблема, но я не хотел оставлять странную ошибку в будущем для кого-то другого.
Помимо явно определенных случаев, таких как RVO (оптимизация возвращаемого значения), Оптимизация не позволяет изменить наблюдаемое поведение программы. Оптимизация должна следовать так называемой правило «как будто».
Поскольку используемый вами компилятор даже незначительно совместим со стандартом (я смотрю на вас Turbo C ++). Это не проблема, потому что стандарт дает строгие гарантии о строительстве и разрушении. Эти гарантии являются основой RAII которая является основой стиля «Модерн» с ++.