Рассмотрите ситуацию. У нас есть некоторый определенный компилятор C++, определенный набор параметров компилятора и определенная программа C++.
Мы компилируем это определенные программы с тем компилятором и теми настройками два раза, делая "чистую компиляцию" каждый раз.
Должен машинный код, испускаемый быть тем же (я не имею в виду меток времени и других дополнительных свойств, я имею в виду только реальный код, который будет выполнен), или позволяется варьироваться от одной компиляции до другого?
Стандарт C ++ определенно не говорит ничего, чтобы этого не произошло. В действительности, однако, компилятор обычно детерминирован, поэтому при идентичных входных данных он будет производить идентичный вывод.
Реальный вопрос в основном заключается в том, какие части среды он считает своими входами - есть немногие , которые, кажется, предполагают, что характеристики машины сборки отражают характеристики цели, и изменяют свои выходные данные в зависимости от на «входах», которые неявно указаны в среде сборки, а не указаны явно, например, с помощью флагов компилятора. Тем не менее, даже это относительно необычно. Обычно вывод зависит от явных входных данных (входных файлов, флагов командной строки и т. Д.)
Готов поспорить, что это будет меняться каждый раз из-за записи некоторых метаданных компилятором (например, скомпилированные в C # библиотеки DLL всегда различаются в некоторых байтах, даже если я выполняю «сборку» дважды подряд, ничего не меняя). Но в любом случае я бы никогда не стал полагаться на то, что он не изменится.
Нет гарантии, что они будут одинаковыми. Также согласно http://www.mingw.org/wiki/My_executable_is_sometimes_different
Мой исполняемый файл иногда отличается, когда я компилирую и перекомпилирую один и тот же исходный код. Это нормально?
Да, по умолчанию и намеренно GCC ~ MinGW не производит ConsistentOutput, если вы его не исправите.
РЕДАКТИРОВАТЬ: Нашел этот пост , который, кажется, объясняет, как сделать их одинаковыми.
В соответствии с правилом as-if в стандарте, пока соответствующая программа (например, без неопределенного поведения) не может определить разницу, компилятор может делать все, что хочет. Другими словами, до тех пор, пока программа выдает один и тот же результат, в стандарте нет ограничений, запрещающих это.
С практической точки зрения, я бы не стал использовать компилятор, который делает это для создания производственного программного обеспечения. Я хочу иметь возможность перекомпилировать выпуск, выпущенный два года назад (с тем же компилятором и т. Д.), И создать тот же машинный код. Я не хочу беспокоиться о том, что причина, по которой я не могу воспроизвести ошибку, заключается в том, что сегодня компилятор решил сделать что-то немного другое.