IT이야기

하나의 플랫폼에서 모든 데이터 유형의 모든 데이터 포인터가 동일한 크기입니까?

cyworld 2022. 7. 4. 22:48
반응형

하나의 플랫폼에서 모든 데이터 유형의 모든 데이터 포인터가 동일한 크기입니까?

char*,int*,long*또는 심지어long long*( ( ( ( ( ( ( ( ( ( (?

같은 사이즈를 보증하는 것은 아닙니다.다만, 제가 사용하고 있는 플랫폼에서는, 통상, 같은 사이즈를 보증하고 있습니다.

C 2011년 온라인 초안:

.5 6.2.5
...
28 A 포인터void 문자 유형에 대한 포인터와 동일한 표현 및 정렬 요건을 가져야 한다. 48) 마찬가지로 호환 가능한 형식의 적격 또는 비적격 버전에 대한 포인터는 동일한 표현 및 정렬 요건을 가져야 한다.구조물 형식에 대한 모든 포인터는 서로 동일한 표현 및 정렬 요건을 가져야 한다.조합 형식에 대한 모든 포인터는 서로 동일한 표현 및 정렬 요건을 가져야 한다.다른 유형에 대한 포인터는 표현 또는 정렬 요건이 같을 필요는 없습니다.
48) 동일한 표현 및 정렬 요구사항은 함수에 대한 주장, 함수에 대한 반환값 및 조합원과의 상호 호환성을 암시하는 것을 의미한다.

꼭 그렇다고 할 수는 없죠..sizeof(double*) == sizeof(int*)예를 들어 폭이 다른2개의 어드레스 버스를 가진 프로세서가 크기가 다른 포인터를 가질 수 있다고 가정합니다.

John Bode가 인용한 대로 C 표준이 무엇을 말하는지 주목하십시오.또한 C 표준은 함수에 대한 포인터의 크기에 대해 전혀 언급하지 않습니다.

POSIX 규격에는 몇 가지 추가 요건이 규정되어 있습니다.

2.12.3 포인터 타입

모든 기능 포인터 유형은 보이드에 대한 형식 포인터와 동일한 표현을 가져야 한다.함수 포인터를 무효 *로 변환해도 표현은 변경되지 않는다.이러한 변환에 의해 발생하는 보이드* 값은 정보의 손실 없이 명시적 캐스트를 사용하여 원래의 함수 포인터 타입으로 변환할 수 있다.

주의: ISO C 규격에서는 이것이 필요하지 않지만 POSIX 준거를 위해서는 필요합니다.

뱅크(페이징) RAM 및/또는 플래시를 갖춘 16비트 임베디드 프로세서에서는 포인터의 크기가 다를 수 있습니다.단, 포인터가 가리키는 데이터의 크기와는 무관합니다.

예를 들어 뱅크 플래시를 탑재한 Freescale의 HCS12 프로세서에서 데이터 포인터는 모두 16비트입니다.

단, 함수 포인터는 니어 포인터의 경우 16비트(발신 함수와 같은 페이지의 코드 또는 뱅킹되지 않은 플래시의 코드) 또는 원포인트 포인터의 경우 24비트(다른 페이지의 코드)로, 주소의 페이지 번호를 포함합니다.

데이터 포인터 크기 제한으로 인해 데이터를 사용하는 함수가 액세스되는 데이터와 동일한 페이지에 있어야 하므로 페이지 플래시에 데이터를 계속 저장하려는 경우에는 복잡합니다.

뱅크된 RAM을 갖춘 16비트 프로세서도 근접 데이터 포인터와 원거리 데이터 포인터의 크기가 다를 수 있습니다.

일반적으로 모든 포인터는 int, long, 문자열, 문자열 배열 또는 함수 중 어느 쪽을 가리키든 단일 메모리 주소를 가리키며, 이는 기계에서 동일한 크기입니다.이는 머신의 프로세서에 이러한 포인터가 로드되는 주소 레지스터가 있으며, 주소 레지스터의 크기가 포인터의 크기를 제어하기 때문입니다.

유일한 예외는 오래된 인텔 8088 16비트 머신과 같은 경우입니다.이 경우 메모리 주소를 특정하기 위한2단계 프로세스가 있습니다.1MByte 주소 공간 내에서 64K 메모리 블록을 식별한 16비트 세그먼트 포인터와 그 세그먼트 내의 특정 메모리 주소를 식별하는 두 번째 16비트 메모리 주소입니다.이 2개의 16비트주소를 조합하여 완전한 20비트 메모리주소를 취득했습니다.그 시나리오에서는, 개개의 16비트 주소와 조합된 20비트 주소의 구별이 가능할 것으로 생각됩니다.

C 또는 C++ ISO 표준에서는 이러한 보증이 없지만, 실제로는 이것이 유지되지 않는 플랫폼은 아직 없습니다.

「」는,reinterpret_cast에 포인터를 입력하는 B.로 이어지는 경우가 는 몇 void*,그리고.unsigned char*(POD의 경우)어떤 조합의 속임수도 그렇겠지그래서 분명한 질문은: 왜 신경을 쓰느냐는 것입니다.

Watcom C를 사용하여 x86 리얼 모드를 프로그래밍할 경우 16비트 근접 포인터와 32비트 원점 포인터를 사용하여 혼합 메모리 모델을 사용할 수 있습니다.

보호 모드 DOS 일에서는 데이터가 다른 섹션에 있을 수 있으므로 함수 포인터와 데이터 포인터의 길이가 다를 수 있습니다.

언급URL : https://stackoverflow.com/questions/1241205/are-all-data-pointers-the-same-size-in-one-platform-for-all-data-types

반응형