sizeof (일부 포인터)는 항상 4와 같은가요? int*, long long*내가

예를 들어
sizeof(char*)로는 않습니다 4. 반환 int*, long long*내가 해봤 모든 것을. 이것에 대한 예외가 있습니까?



답변

당신이 얻는 보증은입니다 sizeof(char) == 1. 보증 없음을 포함하여 다른 보증은 없습니다 sizeof(int *) == sizeof(double *).

실제로, 포인터는 16 비트 시스템에서 크기 2 (하나를 찾을 수있는 경우), 32 비트 시스템에서 4 개, 64 비트 시스템에서 8입니다. 크기.


답변

일반 x86 32 비트 플랫폼에서도 다양한 포인터 크기를 얻을 수 있습니다. 예를 들어 다음을 시도해보십시오.

struct A {};

struct B : virtual public A {};

struct C {};

struct D : public A, public C {};

int main()
{
    cout << "A:" << sizeof(void (A::*)()) << endl;
    cout << "B:" << sizeof(void (B::*)()) << endl;
    cout << "D:" << sizeof(void (D::*)()) << endl;
}

Visual C ++ 2008에서 포인터 대 멤버 함수의 크기에 대해 4, 12 및 8을 얻습니다.

Raymond Chen은 이에 대해 이야기 했습니다 .


답변

이미 게시 된 목록에 대한 또 다른 예외입니다. 32 비트 플랫폼에서 포인터는 4 바이트가 아닌 6 바이트를 사용할 수 있습니다 .

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

int main() {
    char far* ptr; // note that this is a far pointer
    printf( "%d\n", sizeof( ptr));
    return EXIT_SUCCESS;
}

Open Watcom으로이 프로그램을 컴파일하고 실행하면 지원되는 멀리 포인터가 32 비트 오프셋 및 16 비트 세그먼트 값으로 구성되므로 6을 얻게됩니다.


답변

64 비트 컴퓨터 용으로 컴파일하는 경우 8 일 수 있습니다.


답변

기술적으로 말하면 C 표준은 sizeof (char) == 1 만 보장하며 나머지는 구현에 달려 있습니다. 그러나 최신 x86 아키텍처 (예 : Intel / AMD 칩)에서는 상당히 예측 가능합니다.

아마도 16 비트, 32 비트, 64 비트 등의 프로세서가 있다고 들었을 것입니다. 이는 일반적으로 프로세서가 정수에 N 비트를 사용함을 의미합니다. 포인터는 메모리 주소를 저장하고 메모리 주소는 정수이므로 포인터에 사용될 비트 수를 효과적으로 알려줍니다. sizeof는 일반적으로 바이트 단위로 측정되므로 32 비트 프로세서 용으로 컴파일 된 코드는 포인터 크기를 4 (32 비트 / 8 비트 당 8 비트)로보고하고 64 비트 프로세서 용 코드는 포인터 크기를 8로보고합니다. (바이트 당 64 비트 / 8 비트). 32 비트 프로세서에 대한 4GB RAM의 한계는 여기서 시작합니다. 각 메모리 주소가 바이트에 해당하는 경우 더 많은 메모리를 처리하려면 32 비트보다 큰 정수가 필요합니다.


답변

포인터의 크기는 기본적으로 포인터가 구현되는 시스템의 아키텍처에 따라 다릅니다. 예를 들어 32 비트의 포인터 크기는 64 비트 시스템에서 4 바이트 (32 비트) 및 8 바이트 (64 비트)입니다. 머신의 비트 타입은 메모리 주소에 지나지 않습니다. 32 비트 시스템은 2^32주소 공간을 가질 수 있고 64 비트 시스템은 최대 2^64주소 공간을 가질 수 있습니다 . 따라서 포인터 (메모리 위치를 가리키는 변수)는 2^32 for 32 bit and 2^64 for 64 bit머신이 보유한 메모리 주소 ( ) 를 가리킬 수 있어야합니다 .

이러한 이유로 포인터 크기는 32 비트 시스템에서 4 바이트, 64 비트 시스템에서 8 바이트입니다.


답변

16/32/64 비트 차이 외에도 이상한 일이 발생할 수 있습니다.

sizeof (int *)가 하나의 값이되는 기계가 있었을 것입니다. 아마도 4 일 것입니다. 그러나 sizeof (char *)는 더 큽니다. 바이트 대신 단어를 자연스럽게 처리하는 기계는 C / C ++ 표준을 올바르게 구현하기 위해 실제로 원하는 단어 부분을 지정하기 위해 문자 포인터를 “증가”해야합니다.

하드웨어 설계자들이 바이트 어 드레서 빌 러티의 가치를 알게되면서 이것은 매우 드문 일입니다.