32비트 또는 64비트에 따라 데이터 유형 또는 구조의 크기는 누가 결정합니까?
32비트 또는 64비트에 따라 데이터 유형 또는 구조의 크기는 누가 결정합니까?? 파일러?프?를 들면, 들면를예,sizeof(int)
32비트 시스템의 경우 4바이트인 반면 64비트 시스템의 경우 8바이트입니다.
도 그 책을 .sizeof(int)
32비트 및 64비트 컴파일러를 모두 사용하여 컴파일할 경우 4바이트입니다.
CPU가 32비트 및 64비트 응용 프로그램을 모두 실행할 수 있다고 가정하면 컴파일러 또는 프로세서의 데이터 크기를 결정하는 데 누가 주요 역할을 합니까?
궁극적으로 컴파일러입니다.컴파일러 구현자는 CPU가 가장 효율적으로 처리하는 정수 크기에 관계없이 적합하다고 판단되는 모든 정수 크기를 에뮬레이트하기로 결정할 수 있습니다.즉, C(및 C++) 표준은 컴파일러 구현자가 가장 빠르고 효율적인 방법을 자유롭게 선택할 수 있도록 작성되었습니다.많은 컴파일러의 경우 CPU가 기본적으로 64비트 int를 매우 효율적으로 처리하지만 구현자는 int를 32비트로 유지하기로 선택했습니다.
이것은 32비트 기계가 가장 일반적이고 32비트가 될 것으로 예상하고 더 이상은 아닐 것으로 예상했을 때 작성된 프로그램에 대한 휴대성을 높이기 위해 부분적으로 이루어졌다고 생각합니다.(사용자 user3386109가 지적한 바와 같이 32비트 데이터는 공간을 적게 차지하므로 더 빨리 액세스할 수 있기 때문에 선호될 수도 있습니다.)
, 은 서비만를 64트이 int얻싶다면당신, 은래그고를 사용합니다.int64_t
에 int
변수를 선언합니다.알고 값비 32트안에것들알을있고크거다관없사니용경합다는음을우이심이기에나어갈▁다▁use▁you를 사용합니다.int
컴파일러가 가장 효율적인 표현을 선택할 수 있도록 합니다.
다음과 같은 다른 데이터 유형에 대해서는struct
▁as▁types▁such다▁base▁they니와 같은 기본형으로 .int
.
CPU도 아니고 컴파일러도 아니고 운영체제도 아닙니다.모두 동시에 세 개입니다.
컴파일러는 그냥 지어낼 수 없습니다.운영 체제가 제공하는 올바른 ABI[1]를 준수해야 합니다.운영 체제에서 제공하는 구조체와 시스템 호출이 특정 크기와 정렬 요구 사항을 가진 유형을 가지고 있다면 컴파일러 개발자들이 운영 체제가 제공하는 모든 것에 대해 래퍼 기능을 다시 구현하기를 원하지 않는 한 컴파일러는 실제로 자유롭게 자체 현실을 구성할 수 없습니다.그러면 운영 체제의 ABI가 단순히 완전히 구성될 수 있는 것이 아니라 CPU에서 합리적으로 수행할 수 있는 작업을 수행해야 합니다.또한 한 운영 체제의 ABI는 컴파일러 등에서 수행한 작업을 재사용하는 것이 더 쉽기 때문에 동일한 CPU의 다른 운영 체제의 다른 ABI와 매우 유사한 경우가 많습니다.
32비트와 64비트 코드를 모두 지원하는 컴퓨터의 경우 두 모드에서 프로그램을 실행할 수 있도록 운영 체제에서 작업을 수행해야 합니다(시스템이 두 개의 다른 ABI를 제공해야 하기 때문).일부 운영 체제는 이를 수행하지 않으며 선택의 여지가 없는 운영 체제도 있습니다.
ABI는 Application Binary Interface의 약자입니다.프로그램이 운영 체제와 상호 작용하는 방식에 대한 일련의 규칙입니다.운영 체제에서 실행할 수 있도록 프로그램이 디스크에 저장되는 방법, 시스템 호출을 수행하는 방법, 라이브러리와 연결하는 방법 등을 정의합니다.그러나 예를 들어 라이브러리에 연결하려면 프로그램과 라이브러리 간에 함수 호출을 하는 방법(및 그 반대)과 프로그램과 라이브러리 간에 함수 호출을 하는 방법에 동의해야 하며, 프로그램과 라이브러리 모두에서 스택 레이아웃, 레지스터 사용, 함수 호출 규칙 등에 대해 동일한 개념을 가져야 합니다.그리고 함수 호출의 경우 매개변수가 의미하는 바에 동의해야 하며 유형의 크기, 정렬 및 서명을 포함해야 합니다.
(int)의 크기 값을 결정하는 것은 엄격히 100% 전적으로 컴파일러입니다.시스템과 컴파일러의 조합이 아닙니다.컴파일러(및 C/C++ 언어 사양)뿐입니다.
iPad나 iPhone 앱을 개발하면 Mac에서 컴파일러를 실행할 수 있습니다.Mac과 iPhone/iPac은 서로 다른 프로세서를 사용합니다.당신의 Mac에 대한 어떤 것도 iPad에서 int를 위해 사용되어야 하는지 컴파일러에게 알려주지 않습니다.
프로세서 설계자는 사용 가능한 레지스터 및 명령, 효율적인 액세스를 위한 정렬 규칙, 메모리 주소 크기 등을 결정합니다.
C 표준은 기본 제공 유형에 대한 최소 요구 사항을 설정합니다."char"는 8비트 이상, "short" 및 "int"는 16비트 이상, "long"은 32비트 이상, "long long"은 64비트 이상이어야 합니다.또한 "char"는 프로그램이 처리할 수 있는 최소 메모리 단위와 동일해야 하며 표준 유형의 크기 순서를 유지해야 합니다.
다른 표준도 영향을 미칠 수 있습니다.예를 들어, "단일 유닉스 규격"의 버전 2는 int가 최소 32비트여야 한다고 말합니다.
마지막으로 기존 코드가 영향을 미칩니다.포팅은 이미 충분히 어려우며, 아무도 그들이 해야 하는 것보다 더 어렵게 만들고 싶어하지 않습니다.
OS와 컴파일러를 새 CPU로 포팅할 때 누군가는 "CABI"로 알려진 것을 정의해야 합니다.다음을 포함하여 이진 코드가 서로 대화하는 방식을 정의합니다.
- 기본 제공 유형의 크기 및 정렬 요구 사항.
- 구조물에 대한 패킹 규칙(따라서 구조물의 크기)입니다.
- 매개 변수가 전달되고 반환되는 방법
- 스택 관리 방법
일반적으로 CPU 제품군 및 OS 조합에 대해 한 번만 정의되고 ABI는 크게 변경되지 않습니다(때로는 "긴 이중" 변경과 같은 더 모호한 유형의 크기).그것을 바꾸는 것은 상대적으로 적은 이득으로 많은 파손을 가져옵니다.
마찬가지로 OS를 기존 플랫폼과 유사한 특성을 가진 플랫폼으로 포팅하는 경우 일반적으로 OS가 포팅된 이전 플랫폼과 동일한 크기를 선택합니다.
실제로 OS/컴파일러 공급업체는 일반적으로 기본 정수 유형에 대한 몇 가지 크기 조합 중 하나를 결정합니다.
- "LP32": char는 8비트입니다.short 및 int는 16비트, long 및 pointer는 32비트입니다.8비트 및 16비트 플랫폼에서 일반적으로 사용됩니다.
- "ILP32": char는 8비트, short는 16비트입니다.int, long 및 pointer는 모두 32비트입니다.길이가 길면 64비트입니다.32비트 플랫폼에서 일반적으로 사용됩니다.
- "LLP64": char는 8비트입니다.쇼트는 16비트입니다.int와 long은 32비트입니다.long과 pointer는 64비트입니다.64비트 창에 사용됩니다.
- "LP64": char는 8비트입니다.쇼트는 16비트입니다.int는 32비트입니다.long, long, pointer는 64비트입니다.대부분의 64비트 유닉스 계열 시스템에서 사용됩니다.
- "ILP64": char는 8비트, short는 16비트, int, long, pointer 및 long은 모두 64비트입니다.일부 초기 64비트 운영 체제에서 사용된 것으로 보이지만 현재는 거의 볼 수 없습니다.
64비트 프로세서는 일반적으로 32비트 및 64비트 이진 파일을 모두 실행할 수 있습니다.일반적으로 이 작업은 OS에 호환성 계층이 있으면 처리됩니다.따라서 32비트 이진 파일은 32비트 시스템에서 실행될 때 사용하는 것과 동일한 데이터 유형을 사용합니다. 그러면 호환성 계층이 시스템 호출을 변환하여 64비트 OS에서 처리할 수 있습니다.
컴파일러는 기본 유형의 크기와 구조의 레이아웃을 결정합니다.라이브러리가 유형을 선언할 경우, 라이브러리는 유형이 정의되는 방식과 크기를 결정합니다.
그러나 기존 표준과의 호환성과 다른 컴파일러가 생성한 기존 라이브러리에 연결해야 하는 필요성으로 인해 특정 구현에서 특정 선택을 강요하는 경우가 많습니다.예를 들어, 언어 표준은 다음과 같이 말합니다.wchar_t
16비트보다 넓어야 하며 Linux에서는 32비트 너비이지만 Windows에서는 항상 16비트였기 때문에 Windows용 컴파일러는 모두 언어 표준 대신 Windows API와 호환되는 것을 선택합니다.(Windows)를 합니다.long
를 초 , , 파일 비트 할 수 넓다고 코드들은 int
및 64비트로 설정됩니다.long
너비은 32비트 너비)의 언어 표준이 .int
을수 없니다습보보다 넓을 수 .long
.
결과적으로, 금세기의 주류 컴파일러들은 다음과 같은 정의를 선택합니다.int
32비트 너비이지만, 역사적으로 일부에서는 16비트, 18비트, 32비트, 64비트 및 기타 크기로 정의했습니다.일부 컴파일러를 사용하면 다음 중 하나를 선택할 수 있습니다.long
일부 레거시 코드가 가정하는 대로 정확히 32비트 너비이거나 다른 레거시 코드가 가정하는 대로 포인터 너비입니다.
이것은 오늘날 여러분이 가정하는 것을 보여줍니다. 항상 32비트 너비인 어떤 유형이 미래에 여러분을 어떻게 물어뜯을 수 있는지 보여줍니다.32비트 및 64비트 코드로 전환하는 과정에서 C 코드베이스에 이미 두 번 발생했습니다.
하지만 실제로 무엇을 사용해야 할까요?
그int
요즘은 활자가 거의 쓸모가 없습니다.얻을 있는 을 더 (한장점이 . 즉, 한가장있다습유니않다니입형은넓다즉점이지니폭반지이이용할른는▁that▁there▁as▁you▁types▁an▁wide▁aren다유니:▁advantage▁type▁that▁(입즉it▁of'.)int
자동으로 확장될 수 있습니다.int
는 서명된 과 서명되지 않은 가 몇 할 수 .int
다음보다 짧지 않을 것으로 보장되는 가장 작은 유형입니다.int
.)
특정 API를 사용하는 경우 일반적으로 동일한 유형을 사용합니다.표준 라이브러리에는 다음과 같은 특정 목적을 위한 다양한 유형이 있습니다.clock_t
시계 눈금 및time_t
초 단위의 시간
최소 16비트 너비의 가장 빠른 유형을 원한다면, 그것은int_fast16_t
기타 유사한 유형이 있습니다. (특별히 명시되지 않은 한, 이 모든 유형은 에서 정의됩니다.)<stdint.h>
.) 너비가 32비트 이상인 가장 작은 유형을 원하는 경우 가장 많은 데이터를 어레이에 패킹할 수 있습니다.int_least32_t
가능한 한 넓은 타입을 원한다면, 그것은intmax_t
만약 당신이 정확히 32비트를 원하고 당신의 컴파일러가 그런 종류를 가지고 있다는 것을 안다면, 그것은int32_t
32비트 시스템에서 32비트 너비, 64비트 시스템에서 64비트 너비의 포인터를 항상 저장할 수 있는 적절한 크기를 원한다면 다음과 같습니다.intptr_t
배열 인덱싱 및 포인터 연산을 수행하는 데 적합한 유형을 원한다면 다음과 같습니다.ptrdiff_t
부터<stddef.h>
(이것은 C99가 아니라 C89에서 온 것이기 때문에 다른 헤더에 있습니다.)
당신이 정말로 의미하는 타입을 사용하세요!
당신이 컴파일러에 대해 말할 때, 당신은 분명 깨끗한 이미지를 가지고 있을 것입니다.build|host|target
즉, "크로스 컴파일"의 경우 "네이티브 컴파일"과 매우 다르기 때문에 빌드(빌드)하는 시스템, 빌드(호스트)하는 시스템 및 GCC가 코드를 생성할 시스템(타겟)입니다.
"데이터 유형과 구조의 크기를 누가 결정하느냐"는 질문은 컴파일러에게 바이너리를 구축하라고 지시한 대상 시스템에 따라 다릅니다.대상이 64비트인 경우 컴파일러는 크기를 8로 변환하고 대상이 32비트 시스템인 경우 컴파일러는 크기를 4로 변환합니다.이 모든 것은 프로그램을 빌드하는 데 사용한 헤더 파일에 의해 미리 정의되어 있습니다.'$MAKETOP/usr/include/stdint.h'를 읽으면 데이터 유형의 크기를 정의하는 typeef가 있습니다.
크기 차이로 인한 오류를 방지하기 위해 Google 코딩 스타일-Integer_유형은 int16_t, uint32_t, int64_t 등과 같은 유형을 사용하는 것이 좋습니다.다음에 정의되었습니다.<stdint.h>
.
위에는 int와 같은 '일반적인 오래된 데이터'만 있습니다.구조물에 대해 말씀드리면, 구조물의 크기는 구조물의 각 필드에 대한 경계 정렬인 패킹 정렬에 따라 달라지기 때문에 구조물의 크기에 영향을 미칩니다.
컴파일러이며, 더 정확하게는 코드 생성기 구성 요소입니다.
물론 컴파일러는 아키텍처를 인식하고 이에 맞는 선택을 합니다.
경우에 따라 작업은 중간 코드 생성기에 의해 컴파일 시간에 수행되고 두 번째는 런타임에 Just-in-Time 컴파일러에 의해 실행됩니다.하지만 이것은 여전히 컴파일러입니다.
언급URL : https://stackoverflow.com/questions/48921141/who-decides-the-sizeof-any-datatype-or-structure-depending-on-32-bit-or-64-bit
'programing' 카테고리의 다른 글
for-loop에서 오류 건너뛰기 (0) | 2023.06.17 |
---|---|
파이썬에서 두 번 빼기 (0) | 2023.06.17 |
(오라클)페이지화 쿼리를 사용할 때 총 결과 수를 가져오는 방법은 무엇입니까? (0) | 2023.06.17 |
터미널 창의 크기 가져오기(행/열) (0) | 2023.06.17 |
VBA의 하위 문자열 (0) | 2023.06.17 |