IT TIP

int의 크기는 컴파일러 및 / 또는 프로세서에 따라 달라 집니까?

itqueen 2020. 11. 3. 19:34
반응형

int의 크기는 컴파일러 및 / 또는 프로세서에 따라 달라 집니까?


정수의 크기는 컴파일러, OS 및 프로세서에 따라 달라 집니까?


이 질문에 대한 답은 우리가 기꺼이 얻을 수있는 실질적인 고려 사항과 얼마나 멀리 떨어져 있는지에 달려 있습니다.

궁극적으로 이론적으로 C와 C ++의 모든 것은 컴파일러와 컴파일러에만 의존합니다. 하드웨어 / OS는 전혀 중요하지 않습니다. 컴파일러는 모든 두께 의 하드웨어 추상화 계층을 자유롭게 구현하고 모든 것을 에뮬레이션 할 수 있습니다. int언어 표준에 지정된 최소 요구 사항을 충족 할만큼 충분히 크면 C 또는 C ++ 구현 이 모든 크기와 표현을 사용 하여 구현하는 것을 막을 수 없습니다 . 이러한 추상화 수준의 실제 예를 쉽게 사용할 수 있습니다 (예 : Java와 같은 "가상 머신"플랫폼에 기반한 프로그래밍 언어).

그러나 C와 C ++는 매우 효율적인 언어를 위한 것 입니다. 최대 효율성을 달성하기 위해 C 또는 C ++ 구현은 기본 하드웨어에서 파생 된 특정 고려 사항을 고려해야합니다. 이러한 이유로 각 기본 유형이 하드웨어에서 직접 (또는 거의 직접) 지원되는 일부 표현을 기반으로하는지 확인하는 것이 좋습니다. 그런 의미에서 기본 유형의 크기는 하드웨어에 따라 다릅니다.

즉, 64 비트 하드웨어 / OS 플랫폼을위한 특정 C 또는 C ++ 구현 int은 128 비트 메모리를 차지하는 71 비트 1의 보완 부호있는 정수 유형 으로 구현할 수 있으며 나머지 57 비트는 패딩 비트로 사용합니다. 컴파일러 작성자의 여자 친구의 생년월일을 저장하는 데 항상 필요합니다. 이 구현은 특정 실용적인 가치를 가질 것입니다. C / C ++ 프로그램의 이식성에 대한 런타임 테스트를 수행하는 데 사용할 수 있습니다. 그러나 그것이 그 구현의 실질적인 유용성이 끝나는 곳입니다. "일반적인"C / C ++ 컴파일러에서 이와 같은 것을 기대하지 마십시오.


예, 두 프로세서 (구체적으로는 ISA, 명령어 세트 아키텍처, 예 : x86 및 x86-64)와 프로그래밍 모델을 포함한 컴파일러에 따라 다릅니다. 예를 들어 16 비트 시스템에서 sizeof (int)는 2 바이트입니다. 32 비트 컴퓨터는 int. 프로세서 int기본 크기, 즉 레지스터 크기 로 간주 되었습니다 . 그러나 32 비트 컴퓨터는 매우 인기가 많았고 32 비트 프로그래밍 모델을 위해 수많은 소프트웨어가 작성되었습니다. 따라서 64 비트 컴퓨터가 .NET Framework에 대해 8 바이트를 사용한다면 매우 혼란 스러울 것입니다 int. Linux와 Windows는 모두 int. 그러나 크기는 long.

대부분의 * nix 용 LP64Windows 용 LLP64같은 64 비트 프로그래밍 모델을 살펴보십시오 .

Windows와 Linux에서 모두 작동해야하는 코드를 작성할 때 이러한 차이점은 실제로 매우 당황 스럽습니다. 그래서 나는 항상 stdint.h 를 통해 대신 int32_t또는 사용하고 있습니다.int64_tlong


예, 그렇습니다. "컴파일러 나 프로세서에 의존 할 것"을 의미 했습니까? 이 경우 대답은 기본적으로 "둘 다"입니다. 일반적으로 int프로세서 레지스터보다 크지는 않지만 (16 비트보다 작지 않는 한) 더 작을 수 있습니다 (예 : 64 비트 프로세서에서 실행되는 32 비트 컴파일러). 그러나 일반적으로 64 비트 int로 코드를 실행하려면 64 비트 프로세서가 필요합니다.


최근 몇 가지 연구에 따르면 펌웨어 인터뷰를 위해 공부했습니다.

프로세서 비트 아키텍처 (예 : 8 비트, 16 비트, 32 비트, 64 비트)의 가장 큰 영향은 최소주기 수에서 변수를 가장 잘 계산하기 위해 각 바이트의 정보를 가장 효율적으로 저장해야하는 방법입니다.

프로세서의 비트 크기는 CPU가 한 사이클에서 처리 할 수있는 자연스러운 단어 길이를 알려줍니다. 32 비트 머신은 메모리에서 올바르게 정렬 된 경우 64 비트 double을 처리하기 위해 2 개의 사이클이 필요합니다. 대부분의 개인용 컴퓨터는 32 비트 였고 여전히 32 비트이므로 더 큰 부동 소수점 수와 long long int에 대한 옵션이있는 32 비트 정수에 대한 C 컴파일러의 일반적인 선호도가 가장 높은 이유입니다.

분명히 더 큰 변수 크기를 계산할 수 있으므로 CPU의 비트 아키텍처는 처리 효율을 극대화하기 위해 더 크고 더 작은 변수를 저장해야하는 방법을 결정하지만 바이트 크기 정의에 제한 요소는 아닙니다. int 또는 char의 경우 컴파일러의 일부이며 규칙이나 표준에 따라 결정됩니다.

이 사이트 는 특히 비트 패킹과 관련하여 CPU의 자연스러운 단어 길이가 더 크고 작은 변수 유형을 저장하고 처리하는 방법에 어떤 영향을 미치는지 설명하는 데 매우 유용하다는 것을 알았습니다. http://www.geeksforgeeks.org/archives/9705 구조체로. 더 큰 변수는 메모리에서 정렬되어야하므로 CPU의 워드 길이로 나눌 때 가장 적은 수의 사이클을 사용하기 때문에 변수 할당 방법을 매우 잘 알고 있어야합니다. 이렇게하면 변수 할당 순서를 잘못 지정하면 구조체와 같은 항목에 잠재적으로 불필요한 버퍼 / 빈 공간이 많이 추가됩니다.


간단하고 정답은 컴파일러에 따라 다르다는 것입니다. 아키텍처가 무관하다는 의미는 아니지만 컴파일러가 애플리케이션이 아니라이를 처리합니다. 예를 들어 32 비트 또는 64 비트 인 경우 컴파일러의 (대상) 아키텍처에 따라 더 정확하게 말할 수 있습니다.

int더하기 다른 것을 쓰고 다시 읽는 파일을 만드는 Windows 응용 프로그램이 있다고 가정 하십시오. 32 비트와 64 비트 창 모두에서 이것을 실행하면 어떻게 될까요? 32 비트 시스템에서 생성 된 파일을 복사하여 64 비트 시스템에서 열면 어떻게됩니까?

int의 크기가 각 파일마다 다를 것이라고 생각할 수 있지만 동일하지는 않으며 이것이 질문의 핵심입니다. 32 비트 또는 64 비트 아키텍처를 대상으로하는 컴파일러의 설정을 선택하면 모든 것이 결정됩니다.


데이터 유형 크기는 프로세서에 따라 달라집니다. 컴파일러는 CPU가 다음 바이트에 더 쉽게 액세스 할 수 있도록하기를 원하기 때문입니다. 예를 들어, 프로세서가 32 비트 인 경우 컴파일러는 int 크기를 2 바이트 [4 바이트를 선택해야 함]로 선택하지 않을 수 있습니다. 해당 int (4bytes)의 다른 2 바이트에 액세스하면 낭비되는 추가 CPU주기가 필요하기 때문입니다. 컴파일러가 int를 4 바이트로 선택하면 CPU가 한 번에 전체 4 바이트에 액세스하여 애플리케이션 속도를 높일 수 있습니다.

감사


int의 크기는 기본 ISA에 따라 달라지는 단어 길이와 같습니다. 프로세서는 ISA의 하드웨어 구현 일 뿐이며 컴파일러는 ISA의 소프트웨어 측 구현 일뿐입니다. 모든 것은 기본 ISA를 중심으로 이루어집니다. 가장 인기있는 ISA는 요즘 인텔의 IA-32입니다. 단어 길이는 32 비트 또는 4 바이트입니다. 4 바이트는 'int'(짧거나 길지 않은 일반 int) 컴파일러의 최대 크기 일 수 있습니다. IA-32 기반으로 사용할 수 있습니다.


데이터 타입의 크기는 기본적으로 컴파일러의 종류에 따라 다르며 컴파일러는 프로세서의 아키텍처를 기반으로 설계되었으므로 외부 적으로 데이터 타입은 컴파일러 의존적 인 것으로 간주 될 수 있습니다. ex 정수의 크기는 16 비트 tc 컴파일러에서 2 바이트이지만 4 바이트입니다. 동일한 프로세서에서 실행되지만 gcc 컴파일러에서


http://www.agner.org/optimize/calling_conventions.pdf

"3 데이터 표현"에는 컴파일러가 정수 유형으로 수행하는 작업에 대한 개요가 포함되어 있습니다.


예, 터보 C에서 int의 크기는 2 바이트이고 MSVC 컴파일러에서는 4 바이트라는 것을 알았습니다.

기본적으로 int의 크기는 프로세서 레지스터의 크기입니다.

참고 URL : https://stackoverflow.com/questions/2331751/does-the-size-of-an-int-depend-on-the-compiler-and-or-processor

반응형