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

Предположим, у меня есть две единицы перевода, обе из которых используют std::string, Я собираю один из них с -O3, а другой без оптимизации, а затем связать результат вместе. Оба объектных файла будут содержать экземпляры std::string, но я ожидаю, что одна версия будет скомпилирована с оптимизацией, а другая без. Будет ли компоновщик выбрать только один из них во время компоновки? Если да, то какой? Будет ли полученный исполняемый файл всегда работать правильно?

Обновление: поскольку это зависит от реализации, имеет смысл сузить это до поведения gcc и clang, так как они оба реализуют четко определенный и конкретный Itanium ABI, вместо того, чтобы пытаться приблизиться к этому с точки зрения Сам стандарт C ++.

2

Решение

Что касается стандарта C ++, то, вероятно, это далеко выход в крайне левом поле. Для начала, стандарт C ++ не имеет ничего общего с «уровнями оптимизации» или чем-то подобным.

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

Я буду ожидать один из двух результатов:

A) компоновщик будет жаловаться на объединение неидентичных сегментов, или

Б) Один или другой будет выбран случайным образом. Вероятно, какой-либо первый или последний блок перевода передается компоновщику.

Итак, в заключение, единственный способ узнать ответ на этот вопрос — это попробовать его с любым компилятором или компоновщиком, который вы используете, и проверить результаты.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]