Programing

부울 크기가 1 비트가 아닌 1 바이트 인 이유는 무엇입니까?

lottogame 2020. 7. 21. 21:21
반응형

부울 크기가 1 비트가 아닌 1 바이트 인 이유는 무엇입니까?


C ++에서

  • 부울 크기가 1 비트가 아닌 1 바이트 인 이유는 무엇입니까?
  • 4 비트 또는 2 비트 정수와 같은 유형이없는 이유는 무엇입니까?

CPU 에뮬레이터를 작성할 때 위의 것들을 놓치고 있습니다.


CPU는 바이트보다 작은 것을 처리 할 수 ​​없기 때문입니다.


에서 위키 백과 :

역사적으로 바이트는 컴퓨터에서 단일 텍스트 문자를 인코딩하는 데 사용되는 비트 수 였기 때문에 많은 컴퓨터 아키텍처에서 기본 주소 지정 가능 요소 입니다.

바이트가되도록 기본 주소 지정 단위는 , 그 이하의 컴퓨터 아키텍처는 주소 수 없습니다. 그리고 4 비트 바이트를 지원하는 컴퓨터는 (아마도) 존재하지 않기 때문에 4 비트이 없습니다 . bool

그러나 4 비트를 주소 지정이 가능한 기본 단위로 지정할 수있는 아키텍처를 설계 할 수 있으면 bool해당 컴퓨터에서만 4 비트 크기 를 갖게 됩니다!


가장 쉬운 대답은 다음과 같습니다. CPU가 메모리를 비트 단위가 아닌 바이트 단위로 처리하기 때문에 비트 단위 연산이 매우 느리기 때문입니다.

그러나 C ++에서 비트 크기 할당을 사용할 수 있습니다. 비트 벡터에 대한 std :: vector 특수화가 있으며 비트 크기 항목을 가져 오는 구조체도 있습니다.


옛날에는 격렬한 눈보라로 학교에 걸어 가야했지만, 두 가지 길을 모두 오르고 점심 식사는 학교 뒤의 숲에서 추적하여 맨손으로 죽일 수있는 동물이었고 컴퓨터는 사용 가능한 메모리가 훨씬 적었습니다. 오늘. 내가 사용한 첫 번째 컴퓨터에는 6K의 RAM이있었습니다. 6 메가 바이트, 6 기가 바이트, 6 킬로바이트가 아닙니다. 이 환경에서는 가능한 한 많은 부울을 int에 넣는 것이 합리적이므로 정기적으로 작업을 사용하여 꺼내고 넣습니다.

오늘날 사람들이 1GB의 RAM만을 가지고 당신을 조롱하고 200GB 미만의 하드 드라이브를 찾을 수있는 유일한 곳은 골동품 가게에 있습니다. 비트를 포장하는 데 어려움을 겪을 가치는 없습니다.


1 비트 부울과 4 및 2 비트 정수를 가질 수 있습니다. 그러나 이는 아키텍처를 보는 것이 부 자연스러운 방법이기 때문에 성능 향상이없는 이상한 명령 세트를 만듭니다. 실제로 사용되지 않은 데이터를 되찾기보다는 바이트의 더 나은 부분을 "폐기"시키는 것이 합리적입니다.

내 경험에 따르면 여러 부울을 단일 바이트로 묶는 귀찮은 유일한 응용 프로그램은 Sql Server입니다.


비트 필드를 사용하여 하위 크기의 정수를 얻을 수 있습니다.

struct X
{
    int   val:4;   // 4 bit int.
};

일반적으로 구조를 정확한 하드웨어 예상 비트 패턴에 매핑하는 데 사용되지만 :

struct SomThing   // 1 byte value (on a system where 8 bits is a byte
{
    int   p1:4;   // 4 bit field
    int   p2:3;   // 3 bit field
    int   p3:1;   // 1 bit
};

바이트는 언어에서 주소를 지정할 수있는 가장 작은 단위이기 때문입니다.

그러나 예를 들어 bool에 많은 비트가있는 경우 bool을 1 비트로 만들 수 있습니다. 구조체에서 다음과 같이 :

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};

MIPS와 같은 일부 CPU는 4 바이트 워드를 사용하지만 일반적으로 CPU는 1 바이트의 메모리를 기본 단위로 할당하기 때문입니다.

그러나 각 부울에 대해 1 비트가 할당 되는 특별한 방식으로 vector거래 bool됩니다 vector<bool>.


bool1 바이트 일 수 있습니다. 주소 지정 가능한 최소 크기의 CPU이거나 더 클 수 있습니다. 성능을 위해 bool크기가되어야하는 것은 드문 일이 아닙니다 int. 하드웨어 시뮬레이션과 같은 특정 목적을 위해 N 비트가있는 유형이 필요한 경우 해당 라이브러리를 찾을 수 있습니다 (예 : GBL 라이브러리에 BitSet<N>클래스가 있음). 크기가 bool큰 컨테이너 (아마도 큰 컨테이너 가 있음)에 관심이 있다면 비트를 직접 포장하거나 사용할 std::vector<bool>수 있습니다 (컨테이너 요구 사항을 충족하지 않으므로 후자를 조심하십시오).


가능한 최소 크기가 1 바이트 인 경우에도 1 바이트에 대해 8 비트의 부울 정보를 가질 수 있습니다.

http://en.wikipedia.org/wiki/Bit_array

Julia 언어에는 예를 들어 BitArray가 있으며 C ++ 구현에 대해 읽었습니다.


CPU가 1 비트 CPU 인 경우 부울은 1 비트입니다.

일반적으로 CPU의 비트 크기 (예 : 8 비트, 16 비트, 32 비트 등)는 CPU에서 조작 할 수있는 가장 작은 크기의 데이터를 측정 한 것이므로 주소 공간의 크기이기도합니다. (포인터와 데이터는 여러 수준에 있기 때문에 같은 것입니다.)


바이트는 컴퓨터의 작은 디지털 데이터 저장 단위입니다. 컴퓨터에서 RAM에는 수백만 바이트가 있으며 그중 누구라도 주소를 가지고 있습니다. 모든 비트에 대한 주소를 가지면 컴퓨터는 RAM보다 8 배 적은 RAM을 관리 할 수 ​​있습니다.

더 많은 정보 : Wikipedia


에뮬레이터 수준에서 어떻게 구현할 것인지 생각해보십시오.

bool a[10] = {false};

bool &rbool = a[3];
bool *pbool = a + 3;

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);

참고 URL : https://stackoverflow.com/questions/4626815/why-is-a-boolean-1-byte-and-not-1-bit-of-size

반응형