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

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

Mary-Kate Olsen
풀어 주다: 2024-12-01 22:39:19
원래의
574명이 탐색했습니다.

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

함수 포인터 동일성과 고유 주소

질문:

C에서 함수 포인터는 고유한 주소를 갖도록 보장되는 고유한 기능에 대해? 특히 다음 코드의 경우:

void foo() {}
void bar() {}

template<class T> void foo() { }
로그인 후 복사

&foo != &bar 및 &foo != &foo<더블>

답변:

표준에서는 고유 함수에 대한 함수 포인터가 고유 주소를 갖도록 명시적으로 요구하지 않습니다. 그러나 구현이 동일한 정의를 사용하여 함수를 최적화할 수 있으며 이러한 최적화로 인해 동일한 함수 주소가 생성될 수 있습니다.

실제로 Microsoft Visual C(MSVC)는 동일한 구현이 있는 함수를 공격적으로 접어서 동일한 주소를 할당합니다. . 이 동작은 부적합한 것으로 간주됩니다.

반면에 Gold 링커는 동일한 정의가 있더라도 함수에 대해 고유한 주소를 유지하는 보다 안전한 설정을 제공합니다.

자세히 설명:

C 표준은 함수 포인터의 동등성을 다음과 같이 정의합니다. 다음은 다음과 같습니다.

  • 두 함수 포인터가 동일한 함수를 가리키는 경우 동일하다고 비교됩니다.
  • 또는 두 함수 포인터가 동일한 주소를 나타내는 경우에도 마찬가지입니다. 동일한 것으로 간주됩니다.

후자 조건은 다른 함수의 별칭을 구현하는 데 자유도를 제공하며 명시적으로 요구하지 않습니다. 서로 다른 함수에 대한 포인터는 동일하지 않습니다.

그러나 함수의 주소를 취하는 것은 관찰 가능한 동작이며 주소를 변경하는 것은 "as-if" 규칙을 위반할 수 있습니다. 이 규칙은 구현 동작이 표준에 지정된 동작과 구별될 수 없도록 요구합니다.

따라서 표준은 함수 주소 앨리어싱을 명시적으로 금지하지 않지만 "as-if" 규칙을 위반한다고 주장할 수 있습니다. , 부적합으로 이어짐 동작.

관찰:

  • 함수 주소를 변경하면 함수 포인터를 고유한 값으로 사용하는 프로그램과 같이 고유한 함수 주소에 의존하는 프로그램이 중단될 수 있습니다.
  • Gold 및 LLVM의 lld를 포함한 일부 링커는 다음과 같은 경우에만 문제가 있는 주소 별칭을 방지하는 최적화를 수행합니다. 필요합니다.

결론:

표준에서는 함수 주소 앨리어싱을 허용하지만 일반적으로 이 최적화는 이식성 및 안정성 문제를 일으킬 수 있으므로 피하는 것이 좋습니다. .

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

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