> 백엔드 개발 > C++ > 고유한 C 함수가 동일한 주소를 가질 수 있습니까?

고유한 C 함수가 동일한 주소를 가질 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-08 03:34:11
원래의
459명이 탐색했습니다.

Can Distinct C   Functions Have the Same Address?

함수 포인터 동일성과 함수 병합

질문:

다른 함수가 동일할 수 있습니까? 주소? 예를 들어, &foo와 &bar는 같지 않음이 보장되고 &foo 그리고 &foo 구별이 보장됩니까?

답변:

C 표준을 사용하면 구현이 동일한 정의로 함수를 최적화하고 이를 단일 함수로 통합할 수 있습니다. 이는 이러한 두 함수의 주소가 서로 다르지 않을 수 있음을 의미합니다.

표준 준수:

함수 포인터 동일성에 대한 결함 보고서 1400은 이러한 최적화를 인정하지만 그렇지 않음을 시사합니다. 표준이 이를 명시적으로 처리해야 하는지 여부를 명확하게 합니다. 위원회의 응답에서는 구현이 "as-if" 규칙의 제약 조건 내에서 자유롭게 최적화될 수 있다고 명시합니다.

"As-If" 규칙:

Under "as-if" 규칙을 사용하면 구현은 특정 구현 세부 사항을 준수하지 않고도 관찰 가능한 동작을 에뮬레이트할 수 있습니다. 함수의 주소가 명시적으로 구별되어야 하는 것은 아니므로 이 최적화는 규칙을 위반하지 않습니다.

동등 연산자:

표준의 섹션 5.10에 따르면 두 가지 포인터는 둘 다 null이거나, 동일한 함수를 가리키거나, 동일한 주소를 나타내는 경우 동일하게 비교됩니다. 이를 통해 동일한 정의가 있는 두 함수에 동일한 주소를 할당할 수 있습니다.

관찰:

Keith Thompson은 &foo == &bar의 결과를 인쇄하는 것은 다음과 같다고 말합니다. 관찰 가능한 행동. 함수를 통합하여 관찰 가능한 동작을 변경하면 해당 프로그램이 중단될 수 있습니다.

또한 의 SIG_DFL 및 SIG_ERR과 같은 매크로는 다음과 같습니다. 선언 가능한 함수의 주소와 같지 않은 고유한 값을 생성하려면 필요합니다. 이는 동일한 주소를 가진 함수가 이 요구 사항을 위반할 것임을 의미합니다.

프로시저 간 최적화:

GCC 개발자인 Jan Hubička는 동일한 함수를 동일한 주소는 부적합한 동작입니다. 이는 주소 비교에 의존하는 GCC의 미리 컴파일된 헤더 코드의 특정 부분을 손상시킵니다.

결론:

표준에서는 동일한 기능을 통합하는 최적화를 명시적으로 금지하지 않지만 고유한 함수 주소에 의존하는 코드에 대한 잠재적인 영향을 고려하는 것이 중요합니다. 구현 시 주의 깊게 이 최적화에 접근해야 하며 관찰 가능한 동작이 영향을 받는 경우에는 이를 피해야 합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿