Компилятору C++ позволяют испустить другой машинный код, компилирующий ту же программу?

Рассмотрите ситуацию. У нас есть некоторый определенный компилятор C++, определенный набор параметров компилятора и определенная программа C++.

Мы компилируем это определенные программы с тем компилятором и теми настройками два раза, делая "чистую компиляцию" каждый раз.

Должен машинный код, испускаемый быть тем же (я не имею в виду меток времени и других дополнительных свойств, я имею в виду только реальный код, который будет выполнен), или позволяется варьироваться от одной компиляции до другого?

7
задан sharptooth 16 June 2010 в 13:59
поделиться

4 ответа

Стандарт C ++ определенно не говорит ничего, чтобы этого не произошло. В действительности, однако, компилятор обычно детерминирован, поэтому при идентичных входных данных он будет производить идентичный вывод.

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

5
ответ дан 6 December 2019 в 15:18
поделиться

Готов поспорить, что это будет меняться каждый раз из-за записи некоторых метаданных компилятором (например, скомпилированные в C # библиотеки DLL всегда различаются в некоторых байтах, даже если я выполняю «сборку» дважды подряд, ничего не меняя). Но в любом случае я бы никогда не стал полагаться на то, что он не изменится.

1
ответ дан 6 December 2019 в 15:18
поделиться

Нет гарантии, что они будут одинаковыми. Также согласно http://www.mingw.org/wiki/My_executable_is_sometimes_different

Мой исполняемый файл иногда отличается, когда я компилирую и перекомпилирую один и тот же исходный код. Это нормально?

Да, по умолчанию и намеренно GCC ~ MinGW не производит ConsistentOutput, если вы его не исправите.

РЕДАКТИРОВАТЬ: Нашел этот пост , который, кажется, объясняет, как сделать их одинаковыми.

4
ответ дан 6 December 2019 в 15:18
поделиться

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

С практической точки зрения, я бы не стал использовать компилятор, который делает это для создания производственного программного обеспечения. Я хочу иметь возможность перекомпилировать выпуск, выпущенный два года назад (с тем же компилятором и т. Д.), И создать тот же машинный код. Я не хочу беспокоиться о том, что причина, по которой я не могу воспроизвести ошибку, заключается в том, что сегодня компилятор решил сделать что-то немного другое.

4
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

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