답변:
CPU는 1 바이트보다 작은 것을 처리 할 수 없기 때문입니다.
bt
, bts
, btr
및 btc
수있는 하나의 비트를 해결!
bt
바이트 오프셋 주소를 다음 얻을 것 주어진 오프셋, 당신은 바이트에 가서 주소를 지정하는 경우에 관계없이, ... 비트 오프셋 (offset) 리터럴의 비트를 테스트 비트 말의을 (말장난을 변명).
에서 위키 백과 :
역사적으로 바이트는 컴퓨터에서 텍스트의 단일 문자를 인코딩하는 데 사용되는 비트 수였으며 이러한 이유로 많은 컴퓨터 아키텍처에서 기본 주소 지정 요소 입니다.
바이트가되도록 기본 주소 지정 단위는 , 그 이하의 컴퓨터 아키텍처는 주소 수 없습니다. 그리고 4 비트 바이트를 지원하는 컴퓨터가 (아마도) 존재하지 않기 때문에 4 비트 등 이 없습니다 . bool
그러나 4 비트를 기본 주소 지정 단위로 지정할 수있는 아키텍처를 설계 할 수 있다면 bool
해당 컴퓨터에서만 4 비트 크기 를 갖게 됩니다!
int
및 char
내 게시물에서.
bool
이기 때문에 4 비트도 가질 수 없습니다 . 적어도 1의 값을 가져야하고 인접 객체는 C ++에서 자체 주소 를 가져야 하므로 구현시 더 크게 만들고 메모리를 낭비하면됩니다. 이것이 비트 필드가 특별한 경우로 존재하는 이유입니다. 구조체의 비트 필드 멤버는 별도로 주소 지정이 가능할 필요가 없으므로 a보다 작을 수 있습니다 (전체 구조체는 여전히 그럴 수 없습니다). char
sizeof(bool)
bool
char
char
C ++에서 가장 작은 주소 지정 단위 라고 말하는 언어 사양의 참조를 알려주시겠습니까 ?
sizeof(bool)
0.5 일 수는 없습니다. :-) 구현이 합법적으로 하위 바이트 포인터를 확장으로 제공 할 수 있다고 생각하지만, 일반적인 방법으로 할당 된 bool과 같은 "일반"객체는 표준이 말하는대로 수행해야합니다.
가장 쉬운 대답은 다음과 같습니다. CPU가 메모리를 비트가 아닌 바이트로 주소 지정하고 비트 연산이 매우 느리기 때문입니다.
그러나 C ++에서 비트 크기 할당을 사용할 수 있습니다. 비트 벡터에 대한 std :: vector 특수화가 있으며 비트 크기 항목을 취하는 구조체도 있습니다.
예전에는 눈보라 속에서 양쪽으로 오르막길을 걸어 가야했고 점심은 학교 뒤의 숲에서 추적하고 맨손으로 죽일 수있는 동물이었습니다. 컴퓨터는 사용 가능한 메모리가 훨씬 적었습니다. 오늘. 내가 사용한 첫 번째 컴퓨터에는 6K의 RAM이있었습니다. 6 메가 바이트가 아니라 6 기가 바이트, 6 킬로바이트가 아닙니다. 이 환경에서는 가능한 한 많은 부울을 int에 압축하는 것이 합리적 이었으므로 정기적으로 연산을 사용하여이를 꺼내고 넣었습니다.
오늘날 사람들이 1GB의 RAM 만 가지고 있다고 조롱하고 200GB 미만의 하드 드라이브를 찾을 수있는 유일한 곳은 골동품 가게뿐입니다.
일반적으로 CPU는 MIPS와 같은 일부 CPU가 4 바이트 워드를 사용하지만 기본 단위로 1 바이트로 메모리를 할당하기 때문입니다.
그러나 vector
거래 bool
와 특별한 방식으로 vector<bool>
각 부울 하나의 비트가 할당된다.
lw
/ sw
이 훨씬 더 널리 사용됩니다.
가능한 최소 크기가 1 바이트 인 경우에도 1 바이트에 8 비트의 부울 정보를 가질 수 있습니다.
http://en.wikipedia.org/wiki/Bit_array
예를 들어 Julia 언어에는 BitArray가 있으며 C ++ 구현에 대해 읽었습니다.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. 대부분의 컴파일러는 full을 할당unsigned int
하지만 읽기 / 쓰기시 자체적으로 비트 트위들 링을 처리합니다. 또한 그들은 모듈로 연산을 스스로 처리합니다. 그건입니다unsigned small : 4
:) 속성이 0에서 15 사이의 값을 가지고 있으며, 그것은 16에 도착해야 할 때, 그것은 앞의 비트를 덮어 쓰지 않습니다