codememo

C에서 포인터의 크기가 달라집니까?

tipmemo 2023. 9. 20. 20:22
반응형

C에서 포인터의 크기가 달라집니까?

가능한 중복:
포인터의 크기가 가리키는 것에 따라 달라질 수 있습니까?
다른 종류의 포인터가 크기가 다른 플랫폼이 있습니까?

c에서 float에 대한 포인터의 크기가 int에 대한 포인터와 다를 수 있습니까?시도해 본 결과, 모든 종류의 포인터에서도 동일한 결과가 나옵니다.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("sizeof(int*): %i\n", sizeof(int*));
    printf("sizeof(float*): %i\n", sizeof(float*));
    printf("sizeof(void*): %i\n", sizeof(void*));
    return 0;
}

여기서 출력되는 것(OSX 10.6 64비트)

sizeof(int*): 8
sizeof(float*): 8
sizeof(void*): 8

다른 유형의 포인터의 크기가 동일하다고 가정해도 됩니까(물론 한 아치에)?

포인터가 동일한 아치에서 항상 같은 크기인 것은 아닙니다.

포인터 크기가 다른 경우의 예처럼 "근접", "먼" 및 "거대한" 포인터의 개념에 대해 더 자세히 읽을 수 있습니다.

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

옛날에는 예를 들어 사용합니다.DOS 플랫폼의 볼랜드 C 컴파일러, 메모리 모델은 총 5개로 어느 정도 섞일 수도 있었습니다.기본적으로 데이터에 대한 작은 포인터 또는 큰 포인터, 코드에 대한 작은 포인터 또는 큰 포인터, 코드와 데이터의 공통 주소 공간이 64K인 "작은" 모델을 선택할 수 있었습니다.

"아주 작은" 모델에서 만들어진 프로그램 내에서 "거대한" 포인터를 지정하는 것이 가능했습니다.따라서 최악의 경우에는 동일한 프로그램에서 동일한 데이터 유형에 대해 다른 크기의 포인터를 가질있었습니다!

표준은 이것을 금지하지도 않는다고 생각하기 때문에 이론적으로 잘 알려지지 않은 C 컴파일러가 오늘날까지도 이것을 할 수 있습니다.하지만 이를 확인하거나 바로잡을 수 있는 전문가들은 의심할 여지가 없습니다.

와 .void*그래서 일반적으로 그것들은 오늘날 같은 폭의 종류로 실현될 것입니다.

함수 포인터의 너비가 다를 수 있으므로 함수 포인터의 경우 이 문은 사실이 아닙니다.로 C99 로 를 가리킵니다.void*정의되지 않은 행동입니다.

C 표준에는 다른 종류의 포인터가 동일한 크기여야 한다는 것을 보장하는 것이 없으므로 이론적으로 동일한 플랫폼의 int *와 float *는 규칙을 어기지 않고 다른 크기가 될 수 있습니다.

char *와 void *가 동일한 표현 및 정렬 요구사항을 가져야 한다는 요구사항이 있으며, 포인터 유형의 다른 하위 집합에 대한 다양한 유사 요구사항이 있지만 모든 것을 포괄하는 것은 없습니다.

실제로는 상당히 모호한 곳으로 들어가지 않는 한 다른 크기의 포인터를 사용하는 구현에 직면하지 않을 가능성이 높습니다.

네. 드물지만 바이트 주소 지정이 불가능한 시스템에서는 분명 이런 일이 발생할 것입니다.예를 들어, 64Kword = 128KB의 메모리를 가진 16비트 시스템.이러한 시스템에서는 16비트 인트 포인터를 사용할 수 있습니다.그러나 8비트 문자에 대한 문자 포인터는 단어 내에서 높은 바이트/낮은 바이트를 나타내기 위해 추가 비트가 필요하므로 17/32비트 문자 포인터를 갖게 됩니다.

이국적으로 들릴 수도 있지만, 많은 DSP들은 특수한 숫자 코드를 실행하는 데 99.x%의 시간을 소비합니다.사운드 DSP는 16비트 데이터만 처리하면 좀 더 간단해질 수 있으며, 때때로 8비트 수학은 컴파일러에 의해 에뮬레이트됩니다.

저는 C99가 데이터에 대한 포인터가 모두 동일한 크기여야 한다는 것을 보장하는 다양한 포인터 변환 요구사항을 가지고 있다고 답글을 쓰려고 했습니다.그러나 그것들을 주의 깊게 읽으면서, 저는 C99가 다른 종류의 포인터들이 다른 크기가 될 수 있도록 특별히 설계되었다는 것을 깨달았습니다.

예를 들어 정수가 4바이트이고 정렬된 4바이트여야 하는 아키텍처에서는 int 포인터가 char 또는 void 포인터보다 2비트 작을 수 있습니다.출연진이 실제로 양방향으로 교대를 한다면 C99로 괜찮습니다.문자 포인터를 잘못 정렬된 int 포인터에 캐스팅한 결과가 정의되지 않았음을 유용하게 알려줍니다.

C99 표준 참조.섹션 6.3.2.3

예, 포인터의 크기는 플랫폼에 따라 다릅니다.보다 구체적으로 포인터의 크기는 대상 프로세서 아키텍처와 컴파일하는 "비트 크기"에 따라 달라집니다.

경험상 64비트 시스템에서 포인터는 일반적으로 64비트이고 32비트 시스템에서는 일반적으로 32비트 시스템에서 포인터는 일반적으로 64비트입니다.하지만 예외도 있습니다.

포인터는 단지 메모리 주소이므로 포인터가 가리키는 메모리가 무엇을 포함하는지에 관계없이 항상 동일한 크기입니다.그래서 플로트를 가리키는 포인터, 차 또는 인트는 모두 같은 크기입니다.

다른 유형의 포인터의 크기가 동일하다고 가정해도 됩니까(물론 한 아치에)?

플랫 메모리 모델(== 모든 대중적/현대적 플랫폼)을 사용하는 플랫폼의 경우 포인터 크기는 동일합니다.

효율성을 위해 세그먼트 메모리 모델이 있는 플랫폼의 경우 크기가 다른 플랫폼별 포인터 유형이 있는 경우가 많습니다(예:far8086 CPU가 세그먼트 메모리 모델을 사용한 이래로 DOS의 포인터.)그러나 이는 플랫폼에 따라 다르며 표준이 아닙니다.

C++에서 일반 포인터의 크기는 포인터의 크기와 가상 방법에 따라 다를 수 있음을 명심해야 합니다.가상 방법에 대한 포인터는 다형성과 제대로 작동하지 않도록 여분의 정보를 보존해야 합니다.이것은 아마도 제가 알고 있는 유일한 예외일 것이며, 이는 여전히 관련이 있습니다(세분화된 메모리 모델이 다시 돌아올 수 있을지는 의문이기 때문입니다).

함수 포인터가 다른 포인터와 다른 크기인 플랫폼도 있습니다.

이보다 더 다양한 것은 본 적이 없습니다.다른 모든 포인터는 정보의 손실 없이 void*로 캐스트할 수 있도록 표준에 요구되기 때문에 최대 크기(void*)여야 합니다.

포인터는 메모리 주소이므로 특정 컴퓨터에서 동일해야 합니다.32비트 기계 => 4바이트, 64비트 => 8바이트

따라서 포인터가 가리키는 데이터 유형에 관계없이 특정 컴퓨터의 포인터 크기는 동일합니다(메모리 주소를 저장하는 데 필요한 공간은 동일하므로).

가정:저는 당신이 질문에서 선언한 종류의 데이터 값에 가까운 포인터를 말하는 것입니다.

언급URL : https://stackoverflow.com/questions/3520059/does-the-size-of-pointers-vary-in-c

반응형