>백엔드 개발 >C++ >동일한 문자열 리터럴은 C의 번역 단위 전체에서 항상 동일한 주소를 갖습니까?

동일한 문자열 리터럴은 C의 번역 단위 전체에서 항상 동일한 주소를 갖습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-04 20:42:01801검색

Do Identical String Literals Always Have the Same Address Across Translation Units in C?

번역 단위 간 문자열 리터럴 주소 일관성

C 프로그래밍에서 문자열 리터럴은 프로그램의 읽기 전용 메모리에 저장된 문자의 상수 배열입니다. . 동일한 텍스트를 참조하는 동일한 문자열 리터럴은 동일한 메모리 주소를 갖는다고 가정하는 경우가 많습니다. 그러나 번역 단위(개체 파일로 컴파일된 별도의 소스 파일)에서 이 가정에 의존하는 것은 보장되지 않습니다.

표준 사양

C99 및 C 초안 표준에는 명시적으로 명시되어 있습니다. 문자열 리터럴의 구별성은 구현에 따라 정의됩니다. 이는 컴파일러가 동일한 문자열 리터럴을 별도의 개체에 저장하거나 메모리를 절약하기 위해 풀링하도록 선택할 수 있음을 의미합니다.

컴파일러 동작

GCC 및 Visual Studio와 같은 일부 컴파일러 , 컴파일 단위 전체에서 문자열 리터럴 풀링을 지원합니다. 그러나 이 동작은 최적화 설정 및 컴파일러 옵션에 따라 달라질 수 있습니다. 예를 들어, GCC의 -fmerge-constants 플래그는 리터럴 병합을 활성화하는 반면 Visual Studio의 /GF 옵션은 문자열 풀링을 허용합니다.

번역 단위 내 신뢰성

단일 번역 단위 내 (함께 컴파일된 단일 소스 파일), 동일한 문자열 리터럴이 동일한 주소를 가질 것이라고 가정하는 것이 더 안정적입니다. 그러나 이 역시 컴파일러 및 최적화 수준에 따라 달라질 수 있습니다.

이식성이 없는 이유

번역 단위 전체에서 문자열 리터럴 고유성을 요구하지 않기로 한 결정은 다음에서 비롯되었습니다. 당시의 다양한 구현 관행. 일부 구현에서는 ROM 또는 상수 데이터 섹션에 문자열 리터럴을 저장하여 고유성을 보장하는 것이 비실용적입니다.

실용적 고려 사항

동일 주소 가정에 의존하는 것이 편리할 수 있습니다. 어떤 경우에는 문자열 리터럴을 별개의 객체로 취급하는 것이 가장 안전합니다. 이는 이식성을 보장하고 잠재적인 런타임 문제를 방지합니다.

위 내용은 동일한 문자열 리터럴은 C의 번역 단위 전체에서 항상 동일한 주소를 갖습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.