неиспользуемая переменная переменная - PullRequest
2 голосов
/ 08 февраля 2011

Если я объявлю переменную как volatile и если я не буду использовать ее где-нибудь в программе, оптимизирует ли компилятор эту переменную?

Что в случае локальных и глобальных объявлений энергозависимых переменных в этом случае?

TQ.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2011

Компилятор может и, вероятно, устранит (проигнорирует) объявление о неиспользованной переменной volatile (но компилятор не может устранить определение неиспользуемой глобальной переменной - он должен предполагать, что какой-то другой модуль перевода (TU) будет ссылаться на него) .

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

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


Дальнейшие мысли:

Если переменная static volatile и на нее нет ссылок в исходном коде, ее можно удалить?

Ответ (почти наверняка) да. В источнике нет ссылки на переменную, и единственные способы, к которым она может быть доступна в портативном виде, требуют ссылки на нее. Возможные непереносимые хаки будут включать определение нескольких таких статических переменных и передачу ссылки на одну из них какой-либо функции, и эта функция затем сможет получить доступ к другим переменным путем манипулирования адресом. Однако такой код в лучшем случае ужасен и непереносим. Автор такого, вероятно, должен быть где-то вывезен и тихо отговорен от повторного написания такого кода.

Таким образом, определение глобальной переменной невозможно исключить; на него можно ссылаться из другого TU. Неиспользуемое определение статической переменной может быть исключено. Определение локальной переменной, которое не используется, может быть исключено. И это относится к тому, имеет ли рассматриваемая переменная квалификатор volatile или нет.

3 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

Если переменная не используется, это самая оптимальная ситуация из всех. Оптимизация выполняется только в случае операций и расчетов.

Если с данными не выполняется никаких операций, оптимизация не требуется.

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