함수 포인터 동일성과 고유 주소
질문:
C에서 함수 포인터는 고유한 주소를 갖도록 보장되는 고유한 기능에 대해? 특히 다음 코드의 경우:
void foo() {} void bar() {} template<class T> void foo() { }
&foo != &bar 및 &foo
답변:
표준에서는 고유 함수에 대한 함수 포인터가 고유 주소를 갖도록 명시적으로 요구하지 않습니다. 그러나 구현이 동일한 정의를 사용하여 함수를 최적화할 수 있으며 이러한 최적화로 인해 동일한 함수 주소가 생성될 수 있습니다.
실제로 Microsoft Visual C(MSVC)는 동일한 구현이 있는 함수를 공격적으로 접어서 동일한 주소를 할당합니다. . 이 동작은 부적합한 것으로 간주됩니다.
반면에 Gold 링커는 동일한 정의가 있더라도 함수에 대해 고유한 주소를 유지하는 보다 안전한 설정을 제공합니다.
자세히 설명:
C 표준은 함수 포인터의 동등성을 다음과 같이 정의합니다. 다음은 다음과 같습니다.
후자 조건은 다른 함수의 별칭을 구현하는 데 자유도를 제공하며 명시적으로 요구하지 않습니다. 서로 다른 함수에 대한 포인터는 동일하지 않습니다.
그러나 함수의 주소를 취하는 것은 관찰 가능한 동작이며 주소를 변경하는 것은 "as-if" 규칙을 위반할 수 있습니다. 이 규칙은 구현 동작이 표준에 지정된 동작과 구별될 수 없도록 요구합니다.
따라서 표준은 함수 주소 앨리어싱을 명시적으로 금지하지 않지만 "as-if" 규칙을 위반한다고 주장할 수 있습니다. , 부적합으로 이어짐 동작.
관찰:
결론:
표준에서는 함수 주소 앨리어싱을 허용하지만 일반적으로 이 최적화는 이식성 및 안정성 문제를 일으킬 수 있으므로 피하는 것이 좋습니다. .
위 내용은 고유한 C 함수에는 항상 고유한 함수 포인터 주소가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!