programing

(어떤 포인터의) 크기는 항상 4입니까?

copysource 2022. 8. 9. 23:42
반응형

(어떤 포인터의) 크기는 항상 4입니까?

를 들면, '먹다'와 같이요.sizeof(char*)는 44를 합니다.★★★★★★★★★★★★★★★와 같이int*,long long*★★★★★★★★★★★★★★★★★★★★★★★★★★★기에에 예외? ???

은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」sizeof(char) == 1, , 하다, 하다, 하다라는 보장도 sizeof(int *) == sizeof(double *).

실제로 포인터는 16비트 시스템에서는 2사이즈, 32비트 시스템에서는 4사이즈, 64비트 시스템에서는 8사이즈입니다만, 주어진 사이즈에 의존한다고 해서 얻을 수 있는 것은 없습니다.

포인터의 크기는 기본적으로 포인터가 구현되는 시스템의 아키텍처에 따라 달라집니다.예를 들어 64비트 머신의 포인터 크기는 4바이트(32비트)와 8바이트(64비트)입니다.에는, 「Memory Address( 주소)」라고 하는 은 32비트 에는 「Memory Address(메모리 주소)」를 사용할 수 있습니다.2^32 64비트까지 사용할 수 .2^64따라서 는 메모리주소(메모리 위치) 합니다.2^32 for 32 bit and 2^64 for 64 bit를 사용할 수 있습니다.

따라서 포인터의 크기는 32비트 머신에서는 4바이트, 64비트 머신에서는 8바이트가 됩니다.

이미 게시된 목록에 대한 또 다른 예외입니다.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으로 컴파일하여 실행하면 6이 됩니다. 왜냐하면 지원하는 원포인터는 32비트 오프셋과 16비트 세그먼트 값으로 구성되어 있기 때문입니다.

엄밀히 말하면, C 표준은 size of(char) == 1만을 보장하며, 나머지는 구현에 달려 있습니다.다만, 최신의 x86 아키텍처(인텔/AMD 칩등)에서는, 지극히 예측 가능한 것입니다.

프로세서가 16비트, 32비트, 64비트 등이라고 하는 설명을 들어보셨을 것입니다.이것은 보통 프로세서가 정수로 N비트를 사용한다는 것을 의미합니다.포인터는 메모리 주소를 저장하고 메모리 주소는 정수이기 때문에, 이것은 포인터에 사용되는 비트의 수를 효과적으로 알려줍니다.사이즈는 보통 바이트 단위로 측정되므로 32비트 프로세서용 코드는 포인터의 크기를 4(바이트당 32비트/8비트)로 보고하고 64비트 프로세서용 코드는 크기 o를 보고합니다.f 포인터는 8(64비트/바이트 8비트)입니다.이것이 32비트 프로세서의 RAM의 4GB의 제한입니다.각 메모리 주소가 1바이트에 대응하고 있는 경우는, 32비트보다 큰 정수가 필요합니다.

일반 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이 여기서 이것에 대해 이야기했다.

Win64(Cygwin GCC 5.4)에서는 다음 예를 보겠습니다.

먼저 다음 구조를 테스트합니다.

struct list_node{
    int a;
    list_node* prev;
    list_node* next;
};

struct test_struc{
    char a, b;
};

테스트 코드는 다음과 같습니다.

std::cout<<"sizeof(int):            "<<sizeof(int)<<std::endl;
std::cout<<"sizeof(int*):           "<<sizeof(int*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(double):         "<<sizeof(double)<<std::endl;
std::cout<<"sizeof(double*):        "<<sizeof(double*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(list_node):      "<<sizeof(list_node)<<std::endl;
std::cout<<"sizeof(list_node*):     "<<sizeof(list_node*)<<std::endl;
std::cout<<std::endl;

std::cout<<"sizeof(test_struc):     "<<sizeof(test_struc)<<std::endl;
std::cout<<"sizeof(test_struc*):    "<<sizeof(test_struc*)<<std::endl;    

출력은 다음과 같습니다.

sizeof(int):            4
sizeof(int*):           8

sizeof(double):         8
sizeof(double*):        8

sizeof(list_node):      24
sizeof(list_node*):     8

sizeof(test_struc):     2
sizeof(test_struc*):    8

64비트라고 .sizeof(pointer)8.

포인터의 크기가 4바이트인 이유는 32비트 아키텍처용으로 컴파일 중이기 때문입니다.FryGuy가 지적한 바와 같이 64비트 아키텍처에서는 8이 표시됩니다.

16/32/64비트 차이뿐만 아니라 더 이상한 일도 발생할 수 있습니다.

size of(int *)가 1개의 값(대략 4개)이지만 size of(char *)이 더 큰 시스템이 있습니다.바이트 대신 단어를 자연스럽게 주소 지정하는 머신은 C/C++ 표준을 적절하게 구현하기 위해 단어 중 원하는 부분을 지정하는 문자 포인터를 "증강"해야 합니다.

이는 현재 하드웨어 설계자가 바이트 어드레서빌리티의 가치를 학습했기 때문에 매우 드문 현상입니다.

Windows 32비트 머신의 Turbo C 컴파일러에서 포인터와 int의 사이즈는 2바이트입니다.

포인터의 크기는 컴파일러에 따라 다릅니다.그러나 일반적으로 대부분의 컴파일러는 4바이트 포인터 변수를 32비트로, 8바이트 포인터 변수를 64비트 머신으로 지원하도록 구현되어 있습니다).

따라서 포인터의 크기가 모든 기계에서 동일하지는 않습니다.

8비트 및 16비트 포인터는 대부분의 로프로파일 마이크로컨트롤러에서 사용됩니다.그것은 모든 세탁기, 마이크로, 냉장고, 오래된 TV, 그리고 심지어 자동차까지도 의미합니다.

이것들은 실제 프로그래밍과는 무관하다고 할 수 있습니다.하지만 여기 한 가지 실제 예가 있습니다. 2바이트 포인터를 가진 1-2-4k 램(칩에 따라 다름)을 갖춘 Arduino입니다.

최신 제품이고 저렴하며 누구나 쉽게 이용할 수 있으며 코드화할 가치가 있습니다.

제 기억으로는 메모리 주소의 크기를 기준으로 한 것 같습니다.따라서 32비트 주소 체계를 사용하는 시스템에서는 sizeof가 4바이트이므로 4바이트가 반환됩니다.

64비트 머신용으로 컴파일 할 경우 8이 될 수 있습니다.

사람들이 64비트(또는 어떤) 시스템에 대해 말하는 것 외에도, 포인터 투 오브젝트(pointer-to-object) 외에도 다른 종류의 포인터가 있습니다.

멤버 포인터는 컴파일러에 의해 구현되는 방법에 따라 거의 모든 사이즈가 될 수 있습니다.모두 같은 사이즈는 아닙니다.POD 클래스의 멤버에 대한 포인터를 시행한 후 여러 베이스를 가진 클래스의 기본 클래스 중 하나에서 상속된 멤버에 대한 포인터를 시행합니다.재밌다.

일반적으로 사이즈는 다른 플랫폼에서 컴파일 할 때 변경됩니다.32비트 플랫폼에서는 포인터는 항상 같은 크기입니다.다른 플랫폼(64비트가 명백한 예)에서는 이것이 변경될 수 있습니다.

아니요, 포인터의 크기는 아키텍처에 따라 다를 수 있습니다.많은 예외가 있다.

포인터는 주소의 컨테이너일 뿐입니다.32비트 머신에서는 주소 범위는 32비트이므로 포인터는 항상 4바이트가 됩니다.64비트 머신에서는 주소 범위가 64비트일 경우 포인터는 8바이트가 됩니다.

완전성과 역사적 관심을 위해 64비트 세계에서는 LLP64와 LP64라는 이름의 롱타입과 롱타입의 사이즈에 관한 플랫폼 규약이 유닉스 타입의 시스템과 Windows간에 존재했습니다.ILP64라는 이전 표준도 int = 64비트 폭을 만들었습니다.

Microsoft는 LLP64를 긴 길이 = 64비트 너비에 오래도록 32비트로 유지하여 보다 쉽게 휴대할 수 있도록 했습니다.

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

출처 : https://stackoverflow.com/a/384672/48026

언급URL : https://stackoverflow.com/questions/399003/is-the-sizeofsome-pointer-always-equal-to-four

반응형