programing

함수 포인터의 크기에 대해 보장되는 것은 무엇입니까?

telecom 2023. 8. 13. 09:32
반응형

함수 포인터의 크기에 대해 보장되는 것은 무엇입니까?

C에서 나는 함수 포인터가 있는 구조의 크기를 알아야 합니다.모든 플랫폼 및 아키텍처에서 다음을 보장할 수 있습니까?

  • void*의 크기가 함수 포인터의 크기와 같습니까?
  • 함수 포인터의 크기가 반환 유형으로 인해 다르지 않습니까?
  • 함수 포인터의 크기가 매개 변수 유형으로 인해 다르지 않습니까?

저는 이 모든 것에 대한 답이 "예"라고 생각하지만, 저는 확신하고 싶습니다.상황 파악을 위해 전화드렸습니다.sizeof(struct mystruct)그 이상은 아닙니다.

C99 규격, 섹션 6.2.5, 27항에서:

빈 포인터는 문자 형식 포인터와 동일한 표현 및 정렬 요구 사항을 가져야 합니다.마찬가지로, 호환 가능한 형식의 정규화된 버전 또는 비정규화된 버전에 대한 포인터는 동일한 표현 및 정렬 요구사항을 가져야 합니다.구조물 유형에 대한 모든 포인터는 서로 동일한 표현 및 정렬 요구사항을 가져야 합니다.조합 유형에 대한 모든 포인터는 서로 동일한 표현 및 정렬 요구사항을 가져야 합니다.다른 유형에 대한 포인터가 동일한 표현 또는 정렬 요구 사항을 가질 필요는 없습니다.

그래서 아니; 장담할 수 없습니다.void *함수 포인터를 고정할 수 있습니다.

섹션 6.3.2.3, 8항:

한 유형의 함수에 대한 포인터를 다른 유형의 함수에 대한 포인터로 변환한 후 다시 되돌릴 수 있습니다. 결과는 원래 포인터와 동일해야 합니다.

하나의 함수 포인터 유형이 다른 함수 포인터 값을 보유할 수 있음을 암시합니다.기술적으로, 이것은 함수 포인터 유형의 크기가 다를 수 없다는 것을 보장하는 것과 같지 않습니다. 단지 값이 서로 동일한 범위를 차지한다는 것입니다.

아니, 아니, 아니.

C는 코드와 데이터 포인터 크기가 다른 하버드 아키텍처를 선호하지 않습니다. 이러한 아키텍처를 프로그래밍할 때 이상적으로는 프로그램 메모리(문자열 리터럴 등)에 데이터를 저장하고 코드 공간에 객체 포인터가 필요하기 때문입니다.그러나 그것은 그것들을 금지하지 않기 때문에 표준에 관한 한 함수 포인터는 데이터 주소 공간과 다른 크기를 가진 주소 공간을 지칭할 수 있습니다.

다른 유형 한 후하지 않고 수 있습니다. 를 그나어함유형 [*]로 캐스트할 수 입니다.void*그리고 뒤로.따라서 함수 포인터가 서명에 따라 크기가 달라지는 것은 다소 놀라운 일입니다.더 적은 공간에 동일한 값을 저장한 후 다시 회수해야 한다면 추가 공간에 대한 명백한 "사용"은 없습니다.

[*] 고마워, 친구.

다른 답변 외에도 위키백과는 다음과 같이 말합니다.

http://en.wikipedia.org/wiki/Function_pointer

될 수 , 으로 C++의 경우 C++의 경우에는 C++의 경우에는 C++, C++의 경우에는 C++의 경우에는 C++로 구현됩니다.sizeof(Fx)==sizeof(void *)C++의 멤버 포인터는 종종 "팻 포인터"로 구현되며, 일반적으로 가상 상속을 처리하기 위해 단순한 함수 포인터 크기의 두세 배입니다.

함수 포인터는 추상화입니다.표준의 요구 조건이 충족되는 한, 무엇이든 가능합니다.즉, 프로그램에 256개 미만의 함수가 있는 경우 NULL 값이 0이고 값이 1에서 255 사이인 단일 바이트를 인덱스로 사용하여 실제 주소가 있는 테이블로 함수 포인터를 구현할 수 있습니다.255개의 함수를 초과하면 2바이트를 사용하도록 확장될 수 있습니다.

예전에는 흔했던 다양한 크기의 실용적인 예가 있습니다.MS-DOS와 초기 윈도우 C 프로그래밍에서, "중" 메모리 모델에서는 16비트 데이터 포인터를 가지고 있었지만 32비트 함수 포인터를 가지고 있었고, "콤팩트" 메모리 모델은 반대였습니다.

언급URL : https://stackoverflow.com/questions/3941793/what-is-guaranteed-about-the-size-of-a-function-pointer

반응형