타입에 따라 포인터의 사이즈가 다른 플랫폼이 있나요?
C는 표준 다른 유형들에 다른 사이즈가 하나, 예를 들어 C표준은 다른 유형의 포인터가 다른 크기를 가질 수 있도록 합니다 포인터 허용한다.sizeof(char*) != sizeof(int*)
허용된다.허용됩니다. 그러나, 이중 어떤 포인터는 단,포인터가 다음 이야기로 변환됩니다 명령어로변환될 경우가 필요할까.void*
나서 다시 원래 있던 형식으로 개종했다, 원래 값과 동일한 비교해야 한다.그런 다음 원래 유형으로 다시 변환하고 원래 값과 비교해야 합니다.따라서, 논리적으로는 따라서다음과 같다 논리적으로 따른다.sizeof(void*) >= sizeof(T*)
은 모든 유형에 대하여 종류의 모든T
, 맞습니까?맞죠?
현재 사용되는 대부분의 일반적인 플랫폼(x86, PPC, ARM 및 64비트)에서는 포인터의 크기는 포인트 투 타입에 관계없이 네이티브레지스터 크기(4바이트 또는8바이트)와 동일합니다.다양한 유형의 포인터가 다른 크기를 가질 수 있는 난해한 플랫폼 또는 임베디드 플랫폼이 있습니까?특히 데이터 포인터에 대해 묻고 있는데, 함수 포인터의 크기가 비정상인 플랫폼이 있는지 알고 싶습니다.
C++의 멤버 포인터 및 멤버 포인터 함수에 대해 질문하는 것은 절대 아닙니다.공통 플랫폼에서는 비정상적인 크기를 가지며 클래스 포인터 속성(비다형, 단일 상속, 다중 상속, 가상 상속 또는 불완전한 유형)에 따라 1개의 플랫폼 내에서 다를 수도 있습니다.
Prime 50 시리즈는 적어도 PL/I에 대해 Null 포인터에 대해 세그먼트 0777, 오프셋 0을 사용했습니다.이후 모델에서는 세그먼트 0, 오프셋0을 C의 늘 포인터에 사용했습니다.이는 TCNP(Test C Null Pointer)와 같은 새로운 명령어를 필요로 합니다.이는 명백히 잘못된 가정을 한 현존하는 모든 부실하게 작성된 C 코드에 대한 sop으로 간주됩니다.오래된 워드 주소의 프라임 머신도 워드 포인터(int *)보다 큰 바이트 포인터(char *)를 필요로 하는 것으로 악명이 높았다.
Data General의 Eclipse MV 시리즈에는 아키텍처에서 지원되는 세 가지 포인터 형식(워드, 바이트 및 비트 포인터)이 있으며, 그 중 두 가지는 C 컴파일러에 의해 사용됩니다: char * 및 void *에 대한 바이트 포인터, 다른 모든 것에 대한 워드 포인터.32비트 MV 회선이 16비트 Nova 회선에서 발전하는 동안 워드 포인터와 바이트 포인터는 워드의 서로 다른 위치에 오프셋, 간접 및 링 보호 비트를 가지고 있었습니다.일치하지 않는 포인터 형식을 함수에 전달하면 보호 장애가 발생했습니다.결국 MV C 컴파일러는 포인터 유형 불일치 오류가 있는 코드를 처리하기 위해 많은 호환성 옵션을 추가했습니다.
일부 Honeywell-Bull 메인프레임에서는 (내부) 늘포인터에 비트패턴 06000 을 사용합니다.
CDC Cyber 180 시리즈에는 링, 세그먼트 및 오프셋으로 구성된 48비트포인터가 있어요대부분의 사용자(링 11)는 0xB000000000의 늘포인터를 가지고 있습니다오래된 CDC one-completment 머신에서는 비활성 주소를 포함한 모든 종류의 데이터에 대해 all-one-bits 워드를 특수 플래그로 사용하는 것이 일반적이었습니다.
이전 HP 3000 시리즈는 바이트 주소에 워드 주소와는 다른 어드레싱 방식을 사용합니다.따라서 위의 여러 머신과 마찬가지로 char * 및 void * 포인터에 다른 포인터 표현을 사용합니다.
태그 부착 아키텍처인 Symbolics Lisp Machine에는 기존의 숫자 포인터조차 없습니다.C 늘 포인터로 쌍(기본적으로 존재하지 않는 핸들)을 사용합니다.
사용 중인 "메모리 모델"에 따라 8086 패밀리 프로세서(PC 호환)는 16비트 데이터 포인터와 32비트 함수 포인터를 사용하거나 그 반대일 수 있습니다.
일부 64비트 Cray 머신은 워드의 하위 48비트에 int *를 나타냅니다.char *는 상위 16비트의 일부를 사용하여 워드 내의 바이트 주소를 나타냅니다.
기타 링크: Chris Torrek의 메시지입니다.이러한 머신에 대한 자세한 내용은 이쪽입니다.
당신이 원하는 것은 아니지만, 16비트 DOS/Windows 시절에는 포인터와 원포인트(후자는 32비트)의 구별이 있었습니다.
내가 구문을 잘못 알고 있는 것 같아...
int *pInt = malloc(sizeof(int));
int far *fpInt = _fmalloc(sizeof(int));
printf("pInt: %d, fpInt: %d\n", sizeof(pInt), sizeof(fpInt));
출력:
pInt: 2, fpInt 4
따라서, 논리적으로는 따라서다음과 같다 논리적으로 따른다.sizeof(void*) >= sizeof(T*)
모든 유형에 T, 맞습니까?모든 타입 T, 맞죠?
이후 sizeof은 저장은 표현은 그것이 반드시 지금부터 영원까지, bit-patterns에 유효한 값을 따르지 않는다.사이즈는 스토리지 표현에 관한 것이며 모든 비트 패턴이 유효한 값일 필요는 없기 때문에 반드시 이 값을 따를 필요는 없습니다.나는 어디 내 생각에 당신은 적합한 구현을 쓸 수 있을 것 같습니단, 구현을 쓸 수 있다고 생각한다.sizeof(int*) == 8
,sizeof(void*) == 4
,지만 int*.단에int*에사용할수 있는 2^32를넘지 않습니다 값은 이하 2^32 가능한 값이 있다.왜 그러고 싶은지 모르겠어
DOS, 8088s 및 세그먼트 메모리의 전성기에는 모든 코드가 64k(1세그먼트)에 들어가지만 데이터가 여러 세그먼트에 걸쳐 있는 "메모리 모델"을 지정하는 것이 일반적이었습니다. 즉, 함수 포인터는 2바이트, 데이터 포인터, 4바이트가 됩니다.아직 그런 종류의 기계를 위해 프로그래밍을 하고 있는 사람이 있을지 모르겠지만, 아마 일부는 여전히 임베디드 용도로 남아있을 것입니다.
사람들은 쉽게 하버드 아키텍처 기계가 함수 포인터와 다른 모든 포인터를 위한 다른 크기를 가지고 있다고 상상할 수 있다.예를 들면...
근접 및 원점 포인터는 페이지 플래시 또는 RAM과 함께 일부 내장 마이크로 컨트롤러에서 사용되며, 같은 페이지(근접 포인터) 또는 다른 페이지(페이지 정보가 포함되어 있기 때문에 더 큰 원점 포인터)의 데이터를 가리킬 수 있습니다.
예를 들어 Freescale의 HCS12 마이크로컨트롤러는 16비트 Von Neumann 아키텍처를 사용합니다.이것은 어떤 주소도 16비트보다 클 수 없다는 것을 의미합니다.사용 가능한 코드 공간의 양에 제한이 있기 때문에 8비트 페이지 레지스터가 있습니다.
같은 코드 페이지의 데이터를 가리키려면 16비트 주소를 지정하기만 하면 됩니다.이것은 근접 포인터입니다.
다른 코드 페이지의 데이터를 가리키려면 8비트 페이지 번호와 16비트 주소를 모두 해당 페이지에 포함해야 합니다. 그러면 24비트 원거리 포인터가 생성됩니다.
예를 들어, 데이터에 대한 포인터의 크기가 함수에 대한 포인터마다 다를 수 있습니다.임베디드 시스템의 마이크로프로세서에서 흔히 볼 수 있는 현상입니다.앞서 말한 dmckee와 같은 하버드 아키텍처 머신은 이를 쉽게 실현합니다.
gcc 백엔드가 발생하는 것이 귀찮다는 것이 판명되었습니다. : )
편집: 제가 말하는 특정 기계에 대한 자세한 내용은 설명할 수 없지만, 하버드 기계가 왜 이런 일이 일어나기 쉬운지에 대해 덧붙입니다.Harvard 아키텍처는 명령 및 데이터에 대한 스토리지와 경로가 다르기 때문에 명령용 버스가 데이터용 버스보다 '더 크다'면 데이터 포인터보다 더 큰 크기의 함수 포인터가 있어야 합니다.
언급URL : https://stackoverflow.com/questions/916051/are-there-any-platforms-where-pointers-to-different-types-have-different-sizes
'source' 카테고리의 다른 글
JPA에서 복합 프라이머리 키를 만들고 처리하는 방법 (0) | 2022.09.25 |
---|---|
MariaDB/MySQL 복합 고유 인덱스가 유효하지 않습니다. (0) | 2022.09.25 |
JavaScript %(modulo)는 음수에 대해 음의 결과를 제공합니다. (0) | 2022.09.25 |
MySQL 쿼리에서 타임스탬프를 현재 날짜로 변환 (0) | 2022.09.25 |
WordPress를 사용하여 URL에서 추가 변수를 전달하는 방법 (1) | 2022.09.25 |