2011-01-02 4 views
4

정확히 네 부울을 내 구조체에 저장해야합니다. 예, 네 개의 정수를 사용하거나 배열에 넣을 수는 있지만 조금 더 멋지게하고 싶습니다. 나는 "0000"과 같은 int에 대해 생각하고 있었는데, 각 숫자는 부울 값을 나타낼 것이지만, 편집 할 때 한자리 숫자 만 편집 할 수 있습니까? 그 나던 어떤 아이디어더 많은 부울을 저장하는 가장 효과적인 방법

을 위해 ... 하나

감사를 완벽하게 볼

+3

"효과적"이라고 정의하십시오. 가장 빠른 것을 의미합니까? 가장 작은 메모리 풋 프린트? 최소 코드 풋 프린트? 가장 우아한? –

+0

"가장 효과적"이라고 할 수있는 것은 무엇입니까? 적은 메모리를 사용하여 빠르고 쉽게 사용할 수 있습니까? – schnaader

+0

죄송합니다. 더 적은 메모리를 사용하고 사용하기 쉬웠습니다. – tsusanka

답변

17

당신은 비트 필드 구조체 사용할 수 있습니다

struct foo { 
    unsigned boolean1 : 1; 
    unsigned boolean2 : 1; 
    unsigned boolean3 : 1; 
    unsigned boolean4 : 1; 
}; 

그런 다음 쉽게 예를 들어, 개별적으로 각 부울 값을 편집 할 수 있습니다

struct foo example; 
example.boolean1 = 1; 
example.boolean2 = 0; 
+1

참조 문서 : http : //en.wikipedia .org/wiki/Bitfield – marcog

+1

위대한, 완벽 해 보인다. Btw 나는 그 변수의 각 하나가 단지 하나의 비트 걸릴 바로합니까? – tsusanka

+0

이론적으로 그렇습니다. 그러나 메모리 패딩 때문에 조금 더 걸릴 가능성이 큽니다. 그러나 정수를 사용할 때보 다 확실히 메모리 효율이 높습니다. – houbysoft

2

"0000"과 같은 int를 사용하는 것은 비트 필드를 사용하여 호출되며 실제로는 상당히 규칙적으로 수행됩니다. 예, bit shifting을 사용하여 단일 값을 수정할 수 있습니다. 개인적으로 구조체를 수정하지 않고 32 비트 정수 (물론 32 비트 정수를 사용하는 경우)를 최대 32 개까지 확장 할 수 있으므로 int를 bitfield 구조체에 사용하는 것이 좋습니다.

-1
struct _eMyBool 
{ 
    int m_iOne : 1; 
    int m_iTwo : 1; 
    int m_iThree : 1; 
    int m_iFour : 1; 
} eMyBool; 

그러나 심지어 해달라고은 부울을 사용하는 가장 효율적인 방법이라고 생각합니다.

이렇게 처리하기 위해 생성 된 추가 어셈블리 코드는 가격이 책정되었으므로!

For example read this MSDN article

은을 AfaI는 1 비트 alignement 멤버를 액세스 할 때 bitshifting의 additionnal 코드의 풋 프린트가 정말 중요하기 때문에 내가 얻은 메모리에 대한 최소 7의 비율로 존재해야한다고 생각 기억한다.

This is the wikipedia article about data alignement.

+1

MSDN 기사는 흥미 롭습니다.하지만 OP의 정의에서 "가장 효과적인"은 "메모리를 덜 사용하고 사용하기 쉽다"를 의미합니다. 여기에서 교환은 대부분 메모리가 아닌 CPU 명령어입니다. – houbysoft

+0

나는 당신과 동의하는 경향이 있지만이 가격을 염두에 두어야합니다. 어쩌면이 기사가 아니지만 7의 비율을 분명히 기억할 것입니다. 메모리를 많이 얻지 못하면 bitfield 방식이 실제로 "가격"을 가질 수있는 마이크로 옵티 마이 제이션으로 간주됩니다. 부울 중 하나에 대한 액세스가 응용 프로그램을 프로파일 링하는 동안 나타나는 엄청나게 반복되는 작업 인 경우 : 의심 할 여지없이 비트 필드를 제거합니다. –

1

당신이 수백만을 저장하는 경우는 포장 비트로 해.

초당 수백만 번 액세스해야하는 경우 int (또는 shorts 또는 chars)로 지정하십시오.

둘 다 같지 않으면 중요하지 않습니다.

둘 다 그렇다면 심각한 성능 조정이 필요할 수 있습니다.

관련 문제