Адрес строкового литерала в единицах перевода
В C и C программисты часто используют строковые литералы для различных целей. Возникает общий вопрос: достоверно ли предполагать, что один и тот же строковый литерал в разных единицах трансляции будет иметь один и тот же адрес памяти?
Стандарт C/C
С99 и проекты стандартов C специально оставляют эту тему неуточненной. В разделе 6.4.5 проекта стандарта C99 говорится: «Неизвестно, различны ли эти массивы [строковые литералы], при условии, что их элементы имеют соответствующие значения». Это означает, что компилятор волен решать, объединять строковые литералы или нет.
Реализации компилятора
На практике разные компиляторы по-разному ведут себя в отношении объединения строковых литералов.
Обоснование отсутствия требований
Обоснование отсутствия требований отсутствие требования к объединению строковых литералов в стандарте C связано с разнообразием компиляторов и сред выполнения в то время. Некоторые реализации хранили строковые литералы в ПЗУ, тогда как другие хранили их в записываемых разделах данных. Чтобы обеспечить переносимость, было сочтено лучшим не указывать какое-либо конкретное поведение.
Практические соображения
В общем, полагаться на строковые литералы, имеющие одинаковые значения, непереносимо. адрес памяти между единицами трансляции. Однако в пределах одной и той же единицы трансляции поведение, скорее всего, будет согласованным, поскольку компилятор имеет больший контроль над оптимизацией.
Заключение
Адрес памяти Строковый литерал — это деталь реализации, и нельзя полагаться на то, что он останется согласованным между единицами перевода. Важно осознавать этот факт и писать код, независимый от таких деталей реализации.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3