>백엔드 개발 >C++ >고유한 C 함수에는 항상 고유한 주소가 있습니까?

고유한 C 함수에는 항상 고유한 주소가 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-02 05:41:10382검색

Do Distinct C   Functions Always Have Distinct Addresses?

고유 함수에는 고유 주소가 있습니까?

C에서는 일반적으로 서로 다른 구현을 가진 함수에 고유 주소가 있다고 가정합니다. 그러나 특정 시나리오에서는 이것이 항상 사실이 아닐 수도 있습니다.

함수 접기 최적화

최적화 컴파일러는 함수 접기를 사용하여 동일한 구현을 가진 함수를 단일 엔터티로 병합할 수 있습니다. 이로 인해 함수가 동일한 주소를 공유하게 될 수 있습니다.

C 표준에서는 구현이 이러한 최적화를 수행하도록 허용하지만 함수가 동일한 주소를 공유하는 것이 명시적으로 허용되는지 여부는 불분명합니다.

As-if 규칙 및 관찰 가능한 동작

as-if 규칙에 따라 컴파일러는 다음과 같은 경우에 코드를 최적화할 수 있습니다. 관찰 가능한 동작은 변경되지 않습니다. 함수의 주소를 취하는 것은 관찰 가능한 동작으로 간주됩니다.

표준 해석

Defect Report 1400은 이 문제를 다소 모호하게 다루고 있습니다. 구현이 함수에 별칭을 붙일 수 있다는 점을 인정하지만 표준의 정확한 해석은 논쟁의 여지가 있습니다.

관찰

함수 접기에 의존하는 프로그램이 중단될 수 있다는 우려가 있습니다. 기능에 대한 고유한 주소입니다. 예를 들어, 함수 주소를 여러 함수에서 공유하는 경우 고유 식별자로 사용하면 문제가 될 수 있습니다.

C11 요구 사항

C11 표준에는 SIG_DFL 및 SIG_ERR과 같은 매크로가 필요합니다. 선언 가능한 함수와 같지 않은 고유한 값을 생성합니다. 이는 C 표준에서 함수가 동일한 주소를 갖는 것을 금지하고 있음을 의미합니다.

최근 개발

한 gcc 개발자는 MSVC의 공격적인 함수 폴딩이 표준을 위반한다고 밝혔습니다. 또한 llvm-dev 토론에서는 스마트 링커가 주소 관찰이 아닌 호출에만 사용되지 않는 한 기능 결합을 피한다는 점을 강조합니다.

결론

사용 가능한 정보를 기반으로 합니다. , 현재 C 표준이 동일한 주소를 공유하는 동일한 함수를 초래하는 함수 폴딩 최적화를 명시적으로 금지하거나 허용하는지 여부는 여전히 불분명합니다. as-if 규칙은 컴파일러에게 최적화할 수 있는 자유를 제공하지만 관찰 가능한 동작(함수 주소 사용)은 영향을 받지 않은 상태로 유지되어야 합니다. 그러나 함수 접기는 고유한 함수 주소에 의존하는 코드를 잠재적으로 손상시킬 수 있으므로 주의하는 것이 좋습니다.

위 내용은 고유한 C 함수에는 항상 고유한 주소가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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