C에서 부울(부울)은 얼마나 많은 공간을 차지합니까?1비트인가요, 1바이트인가요?
C에서 부울(부울)은 얼마나 많은 공간을 차지합니까?1비트인가요, 1바이트인가요?프로그램이 32비트인지 64비트인지가 중요합니까?
C99를 참조하는 경우_Bool
예:예:
printf("%zu\n", sizeof(_Bool)); /* Typically 1. */
참고로 표준은 다음과 같습니다.
6.2.5
개체형되가로 입니다.
_Bool
값 0과 1을을 할 수 로 큽니다.
크기는 1바이트보다 작을 수 없습니다.그러나 1바이트보다 큰 것은 합법적일 것입니다.
지정이 가능한 작은 "사물은 C에 주 지 가 물 가 "건 "은 "입 "다 "니 "입니다.char
C의 모든 변수는 고유한 주소를 가져야 합니다. 따라서,bool
(로 이작수없참다니습을다보로.)char
하지만 항상 8비트는 아닙니다.)
오래된 C 표준에서는 이러한 유형이 정의되지 않았습니다.그러나 많은 내장 마이크로 컨트롤러에는 단일 비트 플래그의 효율적인 처리를 허용하는 특수 회로가 포함되어 있습니다. 어떤 것은 어디에나 저장된 변수의 이러한 처리를 허용하는 반면, 다른 것은 메모리의 특정 영역에 저장된 변수에만 허용합니다.이러한 프로세서를 위한 컴파일러는 정적 지속 시간의 개별 변수를 유형 "비트"로 선언할 수 있습니다. 이러한 변수는 일반적으로 스토리지 1비트만 사용합니다(필요한 경우 이러한 사용을 수용할 수 있는 영역 내에서 할당됨).일부 컴파일러는 비재귀적 루틴의 자동 변수를 '비트' 유형으로 선언할 수 있지만, 이를 '정적'으로 간주합니다(이러한 컴파일러와 함께 제공되는 링커는 루틴이 호출하는 다른 루틴을 식별해야 함).재상시성으로 태그되지 않은 루틴이 상호 교환 방식으로 서로 호출하는 프로그램을 거부합니다.
주목할 만한 몇 가지 사항:
- 컴파일러가 "진정한" 비트 변수를 지원하는 프로세서는 일반적으로 바이트 전체 플래그에서 설정, 삭제 또는 분기할 수 있는 것보다 더 빠르고 더 적은 코드로 이러한 변수의 값을 설정, 삭제 또는 분기할 수 있습니다.
- 이러한 프로세서의 대부분은 RAM 용량이 매우 작습니다.많은 프로세서에서 (어레이 요소 또는 구조 필드와 구별되는) 개별 변수가 각각 비트 또는 바이트가 걸리는지에 대한 질문은 걱정할 가치가 없습니다.그러나 메모리가 25바이트인 프로세서에서는 16개의 플래그가 각각 1바이트씩을 차지하는 것과 16개의 플래그가 모두 2바이트로 결합되는 것 사이에는 큰 차이가 있습니다.
- 적어도 제가 본 컴파일러에서 비트 변수는 구조 필드나 배열 요소로 사용되지 않을 수도 있고, 하나의 주소를 가질 수도 없습니다.
저는 C99 또는 C++ 표준 이후 버전에 대해 충분히 알지 못하므로 주소가 없는 독립형 비트 유형의 개념이 있는지 알 수 없습니다.저는 그러한 것이 가능해서는 안 될 이유를 생각할 수 없습니다. 특히 표준은 이미 l 값과 매우 유사하게 동작하지만 주소가 없는 구조 비트 필드와 같은 개념을 인식합니다.일부 링커는 이러한 변수를 지원하지 않을 수 있지만 실제 크기를 구현에 의존적으로 만들어 수용할 수 있습니다(프로그램 속도나 총 메모리 사용량을 제외하고는 이러한 변수가 각각 1비트인지 64비트인지 구분할 수 없습니다).
32비트든 64비트든 상관없습니다. 프로세서에 대한 명령어의 크기는 완전히 다릅니다.
부울은 두 개의 다른 값만 필요로 하기 때문에 실제 1비트를 사용합니다.그러나 크기를 (bool)로 지정하면 1바이트를 반환합니다.실용적인 이유로 남은 7비트는 충전재입니다.
크기가 1바이트 미만인 변수는 저장할 수 없습니다.
-> bool은 1바이트를 차지합니다.
부울의 정확한 크기는 컴파일러마다 다르겠지만 항상 최소 1바이트입니다.
c++에서 char와 bool의 크기가 같은 이유는 무엇입니까?
컴파일러에 따라 다릅니다. 일부는 1바이트, 일부는 int 크기입니다. (intbool은 typeef 또는 #int의 typeef입니다.)저는 심지어 bool을 짧은 것으로 보았습니다.
하지만 조금도 기대하지 마세요.포인터를 void*로 캐스팅한 다음 동일한 값을 유지해야 하므로 void*가 바이트를 주소로 지정하기 때문에 불가능합니다.BTW 이것이 개별 필드(내 값:2에서와 같이)를 해결할 수 없는 한 가지 이유입니다.
32비트 또는 64비트는 포인터 크기와 관련이 있으므로 일반적으로 32 또는 64비트 빌드에 차이가 없습니다.
일반적으로 1바이트(8비트)를 차지합니다.유형 크기를 확인하기 위해 사용하는 일반적인 코드는 다음과 같습니다.댓글의 샘플 출력은 제 문자가 1바이트(8비트)이고, bool도 마찬가지라고 합니다.
/**
* using gcc, you can compile this with the following command:
* g++ -otype-sizes type_sizes.cpp
* and then run with with
* ./type-sizes
*
* output on my 64bit linux machine follows. Note that
* the not-so-primitive types are reporting size on
* the stack (the actual data in on the heap and is
* not reported by sizeof()). To get the "length" of
* these you can use vector<>::size() or string::length().
bits in a single char: 8
Sizes of primitive types:
char: 1
bool: 1
short: 2
int: 4
long: 8
long long: 8
float: 4
double: 8
long double: 16
Not so primitive types:
string(""): 8
string("Hello, World!"): 8
vector<int>(0): 24
vector<int>(10): 24
*
**/
#include <climits>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
cout << "bits in a single char: " << CHAR_BIT << endl
<< endl
<< "Sizes of primitive types:\n"
<< " char: " << sizeof(char) << endl
<< " bool: " << sizeof(bool) << endl
<< " short: " << sizeof(short) << endl
<< " int: " << sizeof(int) << endl
<< " long: " << sizeof(long) << endl
<< " long long: " << sizeof(long long) << endl
<< " float: " << sizeof(float) << endl
<< " double: " << sizeof(double) << endl
<< " long double: " << sizeof(long double) << endl
<< endl
<< " Not so primitive types:\n"
<< " string(\"\"): " << sizeof(string("")) << endl
<< " string(\"Hello, World!\"): " << sizeof(string("Hello, World!")) << endl
<< " vector<int>(0): " << sizeof(vector<int>(0)) << endl
<< " vector<int>(10): " << sizeof(vector<int>(10)) << endl
<< endl;
}
언급URL : https://stackoverflow.com/questions/8014161/in-c-how-much-space-does-a-bool-boolean-take-up-is-it-1-bit-1-byte-or-someth
'programing' 카테고리의 다른 글
Oracle SQL에서 인덱스를 표시하는 방법 (0) | 2023.07.05 |
---|---|
파이썬에서 최상위 디렉터리만 나열하는 방법은 무엇입니까? (0) | 2023.07.05 |
Spring application.properties 파일에서 식 사용 (0) | 2023.07.05 |
Oracle DB에서 Ghost 제약 조건 찾기 (0) | 2023.07.05 |
dplyr 메시지 'summarise()' 출력을 'x'('.groups' 인수로 재정의함)로 다시 그룹화하는 것을 어떻게 해석합니까? (0) | 2023.07.05 |