2010-07-06 5 views
36

가능한 중복 :
What does ‘unsigned temp:3’ meansC에서 선언 내에서 콜론은 무엇을 의미합니까?

내가 어떤 커널 코드를 학습하고, 다음과 같은 라인을 따라 온거야 (리눅스 2.4, sched.h에에서, 구조체의 mm_struct) :

unsigned dumpable:1; 

이것은 무엇을 의미합니까?

+0

3 진법은 기본 3입니다. 당신은 3자를 의미하고, 그것이 유일한 3 진 연산자이지만 John이 그 이름이 아닌 것처럼 말합니다. –

+0

감사합니다. 이러한 수정에 감사드립니다. 나는 관련성이 없어서 그 질문을 모두 삭제했다. – Tzafrir

+4

저는 콜론 태그가이 질문에 남아 있어야한다고 생각합니다. 다른 사람들은 저처럼, 묻기 전에이 단어가 무엇을 의미하는지 알아 내려고 시도하기 위해 그 단어를 사용합니다. – Tzafrir

답변

53

회원은 bitfield입니다. 코드의 의미는 dumpable이 구조에서 정확히 1 비트를 차지한다는 의미입니다.

비트 수준에서 멤버를 팩할 때 비트 필드가 사용됩니다. 구조체에 많은 플래그가있을 때 사용되는 메모리 크기를 크게 줄일 수 있습니다. 우리는 공지 숫자 제약 4 부재를 갖는 구조체를 정의하는 경우, 예를 들어

0 < a < 20 
    b in [0, 1] 
0 < c < 8 
0 < d < 100 

후 구조체는 푸 의 비트

처럼 배열 될있다

struct Foo { 
    unsigned a : 5; // 20 < 2^5 = 32 
    unsigned b : 1; // 
    unsigned c : 3; // 
    unsigned d : 7; // 100 < 2^7 = 128 
}; 

로서 선언 될 수있다

     ddddddd c cc b aaaaa 
--------- --------- --------- ---------- 
         octet 1  octet 0 
=========================================== 
       uint32 

대신

,210

이있는 비트 수 때문에 값

# wasted space which is not used by the program 
# v          v 
          ddddddd         ccc 
------------------------------------ ------------------------------------ 
      uint32         uint32 


            b        aaaaa 
------------------------------------ ------------------------------------ 
      uint32         uint32 

그래서 당신이 함께 많은 회원을 포장하여 공간을 절약 할 수 있습니다

의 범위를 낭비하고 있습니다.

C 표준은 비트 필드가 "주소 지정 가능한 저장 장치"내에 배열 또는 패킹되는 방법을 지정하지 않는다는 것에 유의하십시오. 또한 직접 멤버 액세스에 비해 비트 필드가 느립니다.

+5

멋진 답변을 보내 주셔서 감사합니다. 캐주얼 독자를 위해 비트 필드의 구현은 컴퓨터에 종속적 일뿐만 아니라 컴파일러에 종속적이기 때문에 메모리의 해당 비트 위치에 대한 가정을 사용하는 코드는 매우 중요하지 않습니다. – Tzafrir

+1

C99 표준은 충분한 공간을 사용할 수있을 때 비트 필드가 서로 인접하게 배치되도록 정의합니다. "구현은 비트 필드를 보유 할만큼 충분히 큰 주소 지정 가능한 저장 장치를 할당 할 수 있습니다. 충분한 공간이 남아 있으면 구조의 다른 비트 필드 바로 뒤에 오는 비트 필드가 동일한 장치의 인접한 비트로 채워집니다." – waynix

5

비트 필드라는 의미입니다. 즉, 덤프 가능 크기는 단일 비트이며, 0 또는 1로만 할당 할 수 있습니다. 일반적으로 오래된 코드에서 공간을 절약하기 위해 사용되거나 하드웨어와 인터페이스하는 하위 레벨 코드 (패킹이 이식성이 아닐지라도)에 사용됩니다. 자세한 내용은 here을 참조하십시오.

+0

포장은 정확하게 지적한 것처럼 보이지는 않습니다. 종종 비트 필드는 4 바이트 경계에 정렬됩니다. 그러나 이것에 영향을 미치는 컴파일러 옵션이 있습니다. – GorillaPatch

3

구조체 내부에서 사용할 경우 콜론 다음의 숫자는 변수 (또는 비트 필드)를 구성하는 비트 수를 나타냅니다.

따라서 unsigned dumpable:1;은 단일 비트 필드입니다.

관련 문제