번역 단위 간 문자열 리터럴 주소 불일치
C 및 C에서는 문자열 리터럴이 서로 다른 번역 단위(객체 파일)에 있다고 가정하는 경우가 많습니다. 컴파일 중에 생성됨)은 동일한 메모리 주소를 갖습니다. 그러나 이 아이디어는 컴파일러와 구현 간에 이식 가능하지 않습니다.
C99 및 C 초안 표준에 따르면 동일한 문자열 리터럴과 관련된 동작은 명시적으로 지정되지 않은 상태로 남아 있습니다. 즉, 컴파일러는 이를 자유롭게 풀링하거나 병합하거나 각 참조에 대해 별도의 인스턴스를 생성할 수 있습니다.
Visual Studio는 /GF 컴파일러 옵션을 통해 명시적으로 문자열 리터럴 풀링을 허용하는 반면, GCC는 -fmerge-constants를 통해 이를 지원합니다. 깃발. 그러나 두 컴파일러 모두 특정 하드웨어 또는 링커 지원 여부에 따라 이 기능을 조건부로 사용합니다.
따라서 여러 번역 단위에서 문자열 리터럴에 대해 동일한 메모리 주소를 사용하는 것은 이식성이 없습니다. 동일한 번역 단위 내에서도 컴파일러 최적화로 인해 문자열 리터럴을 처리할 때 예측할 수 없는 동작이 발생할 수 있습니다.
이러한 표준화 부족은 언어 개발 당시 C 구현의 다양한 특성으로 인해 발생했습니다. ROM 기반 시스템에서는 문자열 리터럴을 읽기 전용 메모리에 저장해야 했기 때문에 문자열 리터럴의 고유성과 쓰기 가능성을 보장하는 것은 비현실적인 것으로 간주되었습니다.
위 내용은 번역 단위 전체의 문자열 리터럴이 다른 메모리 주소를 갖는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!