programing

비트 필드가 있는 구조물의 크기는 어떻게 결정/측정됩니까?

iphone6s 2023. 6. 11. 10:25
반응형

비트 필드가 있는 구조물의 크기는 어떻게 결정/측정됩니까?

#include <stdio.h>

typedef struct size
{
        unsigned int a:1;
        unsigned int b:31;
        unsigned int c:1;
} mystruct;

int main()
{
        mystruct a;
        printf("%d", sizeof(a));
        return 0;
}
  • 와 함께int b:31출력은 8입니다.
  • 와 함께int b:1출력은 4입니다.
  • 와 함께int b:32출력은 12입니다.

누가 이것의 이유를 설명해 줄 수 있습니까?

중요한 것은 순서입니다.다음 코드는 출력 8을 제공합니다.

#include<stdio.h>

typedef struct size
{
        unsigned int b:32;
        unsigned int a:1;
        unsigned int c:1;
}mystruct;

int main(int argc, char const *argv[])
{
        mystruct a;
        printf("\n %lu \n",sizeof(a));
        return 0;
}

부호 없는 int는 4바이트를 차지하는 32비트 정수입니다.메모리는 메모리에 연속적으로 할당됩니다.


옵션 1:

unsigned int a:1;       // First 4 bytes are allocated
unsigned int b:31;      // Will get accomodated in the First 4 bytes
unsigned int c:1;       // Second 4 bytes are allocated

출력: 8


옵션 2:

unsigned int a:1;       // First 4 bytes are allocated
unsigned int b:32;      // Will NOT get accomodated in the First 4 bytes, Second 4 bytes are allocated
unsigned int c:1;       // Will NOT get accomodated in the Second 4 bytes, Third 4 bytes are allocated

출력: 12


옵션 3:

unsigned int a:1;       // First 4 bytes are allocated
unsigned int b:1;       // Will get accomodated in the First 4 bytes
unsigned int c:1;       // Will get accomodated in the First 4 bytes

출력: 4


옵션 4:

unsigned int b:32;      // First 4 bytes are allocated
unsigned int a:1;       // Second 4 bytes are allocated
unsigned int c:1;       // Will get accomodated in the Second 4 bytes

출력: 8

비트 필드가 무엇인지 알고 있는지는 말하지 않지만 알고 있다고 생각합니다.

구현에서, 당이실바는로한분, 히명행신.unsigned int는 4바이트를 차지하는 32비트 정수입니다.이것은 첫 번째와 두 번째 예를 설명합니다.분명히 총 33비트의 3비트 필드가 단일 비트에 맞지 않습니다.unsigned int첫합니다. 총 따서바첫예 8가필요니다합비비에트총라다니필확습실히번맞는들어의드 3째트트 3이서에 3에비▁a확다▁an▁hence니▁into습비히들▁do실▁tot맞▁3▁fit어▁the따▁bits▁bytes▁in▁bitfields▁certainly▁first▁example라▁the.unsigned int따라서 두 번째 예제에서는 4바이트만 사용할 수 있습니다.

또한 비트 필드는 여러 정수에 걸쳐 있을 수 없습니다.이것이 세 번째 예를 설명합니다.저는 그것이 표준의 요구사항인지 아니면 단지 구현의 세부사항인지 기억할 수 없습니다.쪽이든, 느쪽든 이로이 후그어 ,로▁either.b입니다. 32비트. 전체를 채웁니다.unsigned int그 자체로, 두 가지 모두를 강요합니다.a그리고.c그들 자신의 것을 차지하기 위해unsigned int중간전후 에▁hence 입니다.따라서 12바이트입니다.

Steve jessop의 답변에 따르면 도움이 될 수 있는 몇 가지 문서를 추가하여 답변을 이행하기 위한 것입니다.

구조물 또는 결합의 구성원은 가변적으로 수정된 유형이 아닌 완전한 객체 유형을 가질 수 있습니다.또한 멤버는 지정된 수의 비트(있는 경우 부호 비트 포함)로 구성되도록 선언될 수 있습니다.이러한 멤버를 비트 필드라고 합니다. 비트 필드의 너비는 콜론 앞에 옵니다.

구현은 비트 필드를 저장할 수 있을 만큼 충분히 큰 주소 지정 가능한 저장 장치를 할당할 수 있습니다.충분한 공간이 남아 있는 경우 구조물의 다른 비트 필드 바로 뒤에 오는 비트 필드는 동일한 장치의 인접 비트에 패킹되어야 합니다. 공간이 부족할 경우 적합하지 않은 비트 필드를 다음 장치에 넣거나 인접 장치와 겹치는지 여부가 구현 정의됩니다.장치 내 비트 필드 할당 순서(높은 순서에서 낮은 순서 또는 낮은 순서에서 높은 순서)는 구현 정의됩니다.주소 지정 가능한 저장 장치의 정렬이 지정되지 않았습니다.

구조체 개체 내에서 비트 필드가 아닌 멤버와 비트 필드가 있는 장치에는 선언된 순서대로 증가하는 주소가 있습니다.적절하게 변환된 구조체 객체에 대한 포인터는 초기 멤버(또는 해당 멤버가 비트 필드인 경우 비트 필드가 있는 장치)를 가리키며, 그 반대도 마찬가지입니다.구조체 개체 내에 명명되지 않은 패딩이 있을 수 있지만 처음에는 없습니다.

——ISO/IEC 9899:201x 6.7.2.1

정렬

컴파일러는 구조의 크기를 32비트로 반올림하고, 32비트를 참조하려고 시도할 수 있는 각 개체의 크기를 지정하며, 동시에 비트 필드의 순서를 유지합니다.

중간에 32비트 항목이 있고 양쪽에 1비트 항목이 있다면, 332비트 단어를 할당해야 합니다. 즉, 12바이트입니다.

다른 두 경우의 경우, 필드 순서를 유지하면서 비트 필드 시퀀스를 몇 개까지 채울 수 있는지에 대한 문제입니다.

언급URL : https://stackoverflow.com/questions/4129961/how-is-the-size-of-a-struct-with-bit-fields-determined-measured

반응형