2017-05-03 11 views
1

을 개별적으로 사용할 수 있습니다. 개별 비트 필드를 사용하여 8 가지 bool 값의 값을 집합 적으로 나타낼 수있는 방법과 각 비트를 설정하십시오.어떻게 효과적으로 다음과 같은 목적으로 Bitfields를 사용할 수 있습니까? 효율적인 메모리 관리를 배우기 위해

이유는 수천 줄의 붙여 넣기 때문에 붙여 넣지 않을 자체 프로그램에 있습니다. 클래스 전역 범위 안에 100 개 정도의 bool이 모두 필요합니다. 이것은 FPS에 큰 영향을줍니다.

예 :

 uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; 

     if (!b0) { 
     // do something 
     b0 = true; 
     } 
+2

비트에 액세스하는 것은 쉬운 일이 아니며 코드 복잡성이 증가하고 종종 속도가 증가하는 공간을 절약하는 동안 유의하십시오. – NathanOliver

+0

또한 std :: vector 은 각 값에 대해 1 비트 만 사용하도록 특수화되어 있으므로 작업이 이미 완료되었습니다. –

+1

비트 조작 만하면됩니다. 디지털 로직 기억 나니? 켜기/끄기 (XOR). 'b0^= 1'은 그것을 켜거나 끕니다. – jiveturkey

답변

2

비트 필드는 데이터 만 회원을 지정할 수 있습니다.

명시 적 크기의 클래스 데이터 멤버을 선언 [...] 당신은 구조체에 비트 필드를 포장 할 필요가

: http://en.cppreference.com/w/cpp/language/bit_field의 첫 번째 줄에서. 예 :

#include <cstdint> 
struct bool_pack { 
    uint8_t b0 : 1, b1 : 1, b2 : 1, b3 : 1, b4 : 1, b5 : 1, b6 : 1, b7 : 1; 
}; 

int main() 
{ 
    bool_pack b = {}; 

    if (!b.b0) { 
     // do something 
     b.b0 = true; 
    } 
} 

가 대신 사용하는 것이 좋습니다 더 편리한 표준 라이브러리 유형 std::bitset 있습니다. 예 :

#include <bitset> 
int main() 
{ 
    std::bitset<8> b; 

    if (!b[0]) { 
     // do something 
     b[0] = true; 
    } 
} 
+0

당신의 부분에 대한 진정한 하강의 예를 들어 주셔서 감사합니다. –