> 백엔드 개발 > C++ > 본문

C의 모든 포인터는 같은 크기를 갖나요? 놀라운 답변.

Patricia Arquette
풀어 주다: 2024-10-26 19:13:02
원래의
926명이 탐색했습니다.

 Do All Pointers in C   Have the Same Size?  The Surprising Answer.

C에서는 모든 포인터의 크기가 동일합니까?

세계에서 C에서 포인터는 메모리를 관리하고 데이터에 액세스하는 데 중요한 역할을 합니다. 하지만 모두 동일한 크기 제한을 준수합니까? 놀랍게도 대답은 '예'이자 '아니오'입니다.

C 표준의 입장

메모리 주소의 고유한 특성으로 인해 모든 포인터가 동일한 크기를 공유한다고 가정하기 쉽지만 C 표준에서는 이 가정이 적용되는 특정 사례를 명시적으로 설명합니다.


  1. void는 char ([basic.compound]/5)
  2. T const, T 휘발성 및 T const 휘발성과 크기가 동일합니다. 은 T와 크기가 같습니다. 이는 동일한 유형의 cv 정규 버전이 레이아웃 호환성을 나타내고 레이아웃 호환 유형에 대한 포인터가 동등한 값 표현([basic.compound]/3)을 갖는다는 사실에서 비롯됩니다.
  3. 마찬가지로 포인터 동일한 기본 유형을 가진 열거형 유형은 동일한 크기([dcl.enum]/9)를 공유합니다.

실용적 현실< ;/p>

실질적으로 클래스 유형에 대한 포인터는 일반적으로 동일한 크기 제약 조건을 따릅니다. 그 이유는 클래스 유형이 불완전한 경우에도 해당 포인터 유형의 크기를 계속 얻을 수 있다는 표준 요구 사항에 있습니다. 이는 컴파일러에 제한을 가하여 클래스의 내부 구조에 대한 완전한 지식 없이 포인터 유형의 크기를 결정하도록 강요합니다.

컴파일러는 크기 차이를 도입할 수 있는 유연성을 유지합니다. , 클래스 접두사를 기반으로 포인터를 구별하는 것과 같은 이러한 관행은 실제 시나리오에서는 흔하지 않습니다.

대부분의 경우 다음과 같은 크기 동일도 실제로 적용됩니다.< ;/p>


  • 함수 유형에 대한 포인터의 크기는 동일합니다.
  • 데이터 멤버에 대한 포인터의 크기는 동일합니다.
    < li>함수 멤버에 대한 포인터는 동일한 크기를 갖습니다.

이러한 동등성은 정보 손실 없이 특정 포인터 유형 간의 캐스트를 재해석하는 능력에서 발생합니다. 컴파일러는 기술적으로 패딩 변형을 도입할 수 있지만 그렇게 할 실질적인 타당성은 없습니다.

규칙 예외

그러나 "근거리" 포인터와 "원거리" 포인터가 있는 분할된 아키텍처에서는 크기 차이가 발생할 수 있습니다. 일반 규칙과의 차이는 눈에 띄는 예외입니다.

결론적으로 C 표준에서는 포인터 크기 변형 가능성을 허용하지만 실제 응용 프로그램에서는 대부분의 포인터가 다음을 따릅니다. 동일한 크기 제약이 있습니다. 이러한 일관성은 메모리 관리를 단순화하고 코드 가독성을 향상시킵니다.

위 내용은 C의 모든 포인터는 같은 크기를 갖나요? 놀라운 답변.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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