2010-06-22 5 views
3

"필드가 구현 정의되어있는 단어 bounday가 겹칠 수 있는지 여부는 필드의 이름을 지정할 필요가 없으며 이름이없는 필드 (콜론과 너비 만)가 패딩에 사용됩니다 특수 너비 0은 다음 단어 경계에서 정렬을 강제하는 데 사용될 수 있습니다. "C 표준의 비트 필드 설명을 이해하지 못함

이 줄을 가져올 수 없습니다. 설명해 주시겠습니까?

+0

그 줄의 출처에 대해 약간의 컨텍스트를 제공 할 수 있습니까? – Salgar

+0

아마 C 언어 사양. – samoz

답변

0

처음에는 주로 'aligment'메모리와 관련이 있습니다. 컴파일러는 종종 단어 경계에서 변수 또는 필드를 정렬합니다. 한 단어는 32 비트 플랫폼에서 32 비트입니다. 즉, 두 개의 bool은 첫 번째 바이트를 두 단어가 아닌 두 단어로 나눕니다.

비트 필드는 메모리의 레이아웃을 강제 할 수 있습니다. 값의 범위가 0-7 인 경우 특정 필드는 3 비트만 사용합니다.

필드의 이름을 지정할 수 없습니다. 필드를 사용하지 않으려면 필드의 이름을 지정할 필요가 없습니다. 이것은 특정 레이아웃을 강요하는 데 사용될 수 있습니다.

:0을 사용하면 다음 단어 경계에서 자동 정렬됩니다.

일반적으로 어떤 방식 으로든 성능을 조정하지 않으면이 동작이 필요하지 않습니다.

1

기본적으로 주소가 "단어 정렬"이면 프로세서가 더 빠르게 작업을 수행 할 수 있습니다. 단어는 일반적으로 32 비트 또는 4 바이트입니다.

일반적인 프로세서는 "단어"로 정렬되어있어 한 번의 작업으로 전체 "단어"를 검색 할 수 있습니다. 값이 여러 값에 걸쳐있는 경우 프로세서는 동일한 데이터를 가져 오기 위해 여러 작업을 수행해야합니다. 때로는 "이중 단어"를 사용하고 있지만 한 단어가 단어 경계를 넘어선다면 CPU는 데이터 한 단어를 검색하기 위해 두 번의 작업을 수행해야합니다.

단어 정렬 값의 예는 0x10000004, 0x10000008입니다. 단어는 4 바이트이므로 주소는 4로 나눌 수 있어야합니다. 단어가 정렬되지 않은 값은 0x10000003입니다.

프로그래머에게 모든 작업이 예상대로 작동하지만 CPU가 0x10000004를 읽거나 쓰려면 메모리 작업을 1 회 수행해야하지만 CPU가 0x10000003을 읽거나 쓰려면 2 회의 메모리 작업을 수행해야합니다. 단어 경계.

원래 질문과 관련하여, 이것은 기본적으로 컴파일러에 따라 컴파일러가 필드를 단어 정렬 할 수도 있고하지 않을 수도 있습니다. 이것은 크기 대 속도의 예입니다. 단어 정렬을하지 않으면 더 많은 데이터를 압축 할 수 있기 때문에 위와 같이 속도가 느립니다.

5

"필드가 단어 경계와 겹칠 수 있는지 여부는 구현에 따라 결정됩니다.

struct X 
{ 
    int a : 30; 
    int b : 4; 
}; 

그런 다음 컴파일러가 필드 B를 넣어 선택할 수 있습니다 : 우리는 구조체가 있다면

[31] [30] [29] ... [2] [1] [0] | [31] [30] [29] ... [2] [1] [0] 

:

단어의 크기가 32 개 비트를 말할 수있는 메모리의 두 단어를 고려 따라서 각 단어에 일부분이 있거나 두 번째 단어 안에 B가 모두 들어갈 수 있도록 간격을 둘 수 있습니다.

[31] [30] [29] ... [2] [1] [0] | [31] [30] [29] [28] ... [2] [1] [0] 
a--------------------a b-----------------b 
OR 
a--------------------a GAP b-----------------b 

왜 GAP을 떠날 수 있습니까? 따라서 b를 읽거나 쓸 때 메모리에서 한 단어 만 사용해야합니다. 일반적으로 더 빠르고 간단하며 더 적은 CPU 명령어가 필요합니다.

필드의 이름을 지정할 필요가 없습니다. 이름이없는 필드 (콜론과 폭만)는 패딩에 사용됩니다. 우리는 우리의 이전 구조체를 변경 한 경우

, 우리는 명시 적으로 간격을 요청할 수있다 :이 A와 B 사이에 2 개 비트를두고 "말하고

struct X 
{ 
    int a : 30; 
    int : 2; // unnamed field 
    int b : 4; 
}; 

-가 (이름) 식별자가 필요하지 않습니다 나는 그 안에 무엇이 있는지를 결코 묻지 않을 것이고, 그들의 가치를 바꾸라고 요구할 필요가 있기 때문입니다. " 그러나, 30 + 2 == 32 (우리의 단어 크기) ... 당신이 좋아하는 어떤 격차가 있더라도 무엇이든 요구할 수 있습니다. 일부 하드웨어 장치의 값을 처리하고 비트 중 일부가 아닌 다른 비트가 무엇인지 알고 있거나 일부만 사용해야하는 경우 유용 할 수 있습니다. 문서에 이름을 지정하지 않고 그대로 둘 수 있습니다 컴파일러 공간을 하드웨어의 사용에 필요한 단어로 필요한 오프셋에있는 명명 된 비트 필드가있는 동안 무관심하게 만듭니다.

특수 폭 0 다음 단어 경계에 정렬을 강제하기 위하여 사용될 수있다. "이것은 단지 컴파일러는 부분적으로 충전 된 워드에 남아있는 비트 수를 계산하고, 이동 가능 수단

다음 단어의 시작 부분으로 넘어갔습니다 .2 비트 필드를 추가하여 새 단어를 시작한 것처럼 (a가 30 비트이고 단어 크기가 32라는 지식을 바탕으로), 우리는 그 단어를 가질 수있었습니다.

struct X 
{ 
    int a : 30; 
    int : 0; // unnamed field 
    int b : 4; 
}; 

... 컴파일러가 2를 처리합니다. 우리가 다른 크기로 변경하거나 64 비트 워드 크기로 컴파일을 끝내면 컴파일러는 이름없는 필드를 수동으로 수정하지 않고 자동으로 적절한 동작을 조정합니다.

관련 문제