핸들로 사용되는 64 비트 정수가 있습니다. 이 64bit는 다음 필드로 분리해야 개별적으로 액세스 할 수 있도록이를 달성하기 위해 내가 생각할 수있는64 비트 정수 핸들 유형에 대한 간결한 비트 조작
size : 30 bits
offset : 30 bits
invalid flag : 1 bit
immutable flag : 1 bit
type flag : 1 bit
mapped flag : 1 bit
두 가지 것이 있습니다 :
1) 전통적인 비트 연산 (& | << >>
) 등 그러나 나는 이것을 약간은 이상하게 생각한다.
2)를 사용하여 비트 필드 구조체 :
handle.invalid = 1;
하지만 비트 필드는 상당히 문제가 아닌 이식 이해 :
#pragma pack(push, 1)
struct Handle {
uint32_t size : 30;
uint32_t offset : 30;
uint8_t invalid : 1;
uint8_t immutable : 1;
uint8_t type : 1;
uint8_t mapped : 1;
};
#pragma pack(pop)
그런 다음 필드에 접근이 매우 분명해진다.
코드 명확성과 가독성을 극대화하는 목적으로이 비트 조작을 구현하는 방법을 찾고 있습니다. 어떤 접근 방식을 취해야합니까?
사이드 노트 :
핸들 크기가 64bit를 초과 할 수 없습니다;
각 필드 크기가 존중되는 한 이러한 필드가 메모리에 배치되는 순서는 관계가 없습니다.
핸들이 파일에 저장 /로드되지 않으므로 엔디안에 대해 걱정할 필요가 없습니다.
비트 필드가 '문제가있는'것이 아니며 이식성을 예를 들어, 모든 필드를 0으로 지우거나 동시에 두 필드를 설정하거나 지우는 것과 같이 직접 작성할 수있는 매듭의 속도로 코드를 생성합니다. 심각한 코드 공간 제약 조건이 아니라면 어떤 코드를 작성하고 싶은지를 결정해야합니다. – EJP
귀하의 요구 사항을 감안할 때, 비트 필드는 가장 간단한 솔루션처럼 보입니다. 비 호환성은 다른 컴파일러가 어떻게 다른 순서로 정렬할지에 따라 다릅니다. 하지만 그것들 모두에 대해'uint64_t'를 사용해야합니다. –
"핸들"유형의 포인트는 핸들을 저장하는 모든 코드에서 불투명하다는 것입니다. 핸들을 생성하는 코드 만이 내용을 해석합니다. 물론 이식성이 문제가되지 않는다는 것을 의미합니다. –