함수 포인터 동일성과 함수 병합
질문:
다른 함수가 동일할 수 있습니까? 주소? 예를 들어, &foo와 &bar는 같지 않음이 보장되고 &foo
답변:
C 표준을 사용하면 구현이 동일한 정의로 함수를 최적화하고 이를 단일 함수로 통합할 수 있습니다. 이는 이러한 두 함수의 주소가 서로 다르지 않을 수 있음을 의미합니다.
표준 준수:
함수 포인터 동일성에 대한 결함 보고서 1400은 이러한 최적화를 인정하지만 그렇지 않음을 시사합니다. 표준이 이를 명시적으로 처리해야 하는지 여부를 명확하게 합니다. 위원회의 응답에서는 구현이 "as-if" 규칙의 제약 조건 내에서 자유롭게 최적화될 수 있다고 명시합니다.
"As-If" 규칙:
Under "as-if" 규칙을 사용하면 구현은 특정 구현 세부 사항을 준수하지 않고도 관찰 가능한 동작을 에뮬레이트할 수 있습니다. 함수의 주소가 명시적으로 구별되어야 하는 것은 아니므로 이 최적화는 규칙을 위반하지 않습니다.
동등 연산자:
표준의 섹션 5.10에 따르면 두 가지 포인터는 둘 다 null이거나, 동일한 함수를 가리키거나, 동일한 주소를 나타내는 경우 동일하게 비교됩니다. 이를 통해 동일한 정의가 있는 두 함수에 동일한 주소를 할당할 수 있습니다.
관찰:
Keith Thompson은 &foo == &bar의 결과를 인쇄하는 것은 다음과 같다고 말합니다. 관찰 가능한 행동. 함수를 통합하여 관찰 가능한 동작을 변경하면 해당 프로그램이 중단될 수 있습니다.
또한
프로시저 간 최적화:
GCC 개발자인 Jan Hubička는 동일한 함수를 동일한 주소는 부적합한 동작입니다. 이는 주소 비교에 의존하는 GCC의 미리 컴파일된 헤더 코드의 특정 부분을 손상시킵니다.
결론:
표준에서는 동일한 기능을 통합하는 최적화를 명시적으로 금지하지 않지만 고유한 함수 주소에 의존하는 코드에 대한 잠재적인 영향을 고려하는 것이 중요합니다. 구현 시 주의 깊게 이 최적화에 접근해야 하며 관찰 가능한 동작이 영향을 받는 경우에는 이를 피해야 합니다.
위 내용은 고유한 C 함수가 동일한 주소를 가질 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!