문제

내가 읽고 있어요 C ++ 프로그래밍 언어. 그것은 Stroustrup에서 그것을 말합니다 sizeof(char) == 1 그리고 1 <= sizeof(bool). 세부 사항은 구현에 따라 다릅니다. 부울과 같은 단순한 가치가 숯과 같은 공간을 차지하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

현대적인 컴퓨터 아키텍처에서 바이트는 가장 작은 주소 지정된 메모리 단위입니다. 바이트에 여러 비트를 포장하려면 추가 비트 시프트 작업을 적용해야합니다. 컴파일러 수준에서는 메모리 대 속도 요구 사항의 트레이드 오프입니다 (및 고성능 소프트웨어에서는 추가 비트 변속 작업이 애플리케이션을 불필요하게 추가하고 느리게 할 수 있습니다).

다른 팁

C ++에서 부울의 주소를 가져갈 수 있으며 대부분의 기계는 개별 비트를 해결할 수 없습니다.

메모리에 쓸 수있는 가장 적은 양의 공간은 단일 바이트이기 때문에 같은 공간이 필요합니다. 두 값 모두 바이트에 저장됩니다. 이론적으로 부울 값을 나타내려면 1 비트 만 필요하지만 값을 저장하려면 여전히 전체 바이트가 있어야합니다.

이론적으로는 부울을 위해서는 단일 비트 만 필요하지만 1 바이트의 데이터로 일하는 것은 지저분합니다. 무엇이든 달성하려면 더 많은 지침이 필요하며 실제로 혜택을받지 않습니다.

여러 부울을 단일 바이트에 포장하려면 비트 필드 구조.

실제로, 대부분의 구현에서 나는 sizeof (bool) == sizeof (int)에 대해 알고 있습니다. "int"는 CPU가 작업하는 데 가장 효율적인 데이터 크기로 고안되었습니다. 따라서 특정 크기가없는 것 (예 : "char")은 int와 같은 크기입니다. 객체 당 다수의 사람들이 있으면 저장을 위해 포장하는 수단을 구현할 수 있지만 정상 계산 중에는 기본 크기가 남아 있어야합니다.

C ++에는 벡터라고 불리는이 일이 있습니다. 이는 이론적으로 8 개의 부를 저장할 수 있다는 사실을 악용하려고 시도하지만 C ++ 표준위원회의 실수로 널리 알려져 있습니다. "효과적인 STL"이라는 책은 실제로 "사용하지 마십시오"라고 말합니다. 그것은 당신에게 그것이 얼마나 까다로운 지에 대한 아이디어를 제공해야합니다.

BTW : Knuth는 a Bitwise 운영에 전념합니다. 부스트에도 부스트에도 있습니다 도서관 보다 메모리 효율적인 방식으로 많은 비트를 처리하는 데 전념합니다.

바이트는 가장 작은 주소 지정된 메모리 단위입니다.

다음 코드를 고려하십시오.

    bool b[9];
    bool *pb0 = &b[0];
    bool *pb1 = &b[1];

    for (int counter=0; counter<9; ++counter)
    {
         // some code here to fill b with values
         b[counter] = true;

    }

BOOL이 1 비트로 저장되면 PB0은 모두 동일한 주소를 갖기 때문에 PB1과 같습니다. 이것은 분명히 바람직하지 않습니다!

또한 루프의 할당은 비 치유 어셈블리 코드를 초래합니다. 루프의 각 반복마다 다른 비트 변화가 포함됩니다. 고성능 소프트웨어에서 이러한 추가 비트 변속 작업은 애플리케이션을 불필요하게 속도를 늦출 수 있습니다.

STL 라이브러리는 공간이 중요한 상황에서 작업 어라운드를 제공합니다. std :: 벡터의 사용u003Cbool> bool을 1 비트로 저장합니다. 위의 예의 역설은 적용되지 않습니다.

  • 연산자의 과부하 []는 비트 시프트 작업의 엄격함을 숨 깁니다.
  • 포인터 대신 반복자를 사용하면 구현에 추가 유연성이 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top