c 언어 구조 체 바이트 정렬 의 실현 방법

1.바이트 정렬 이란 무엇 인가
c 언어의 구조 체 에 서 는 일반적으로 특정한 규칙 에 따라 바이트 정렬 을 한다.
우 리 는 먼저 코드 를 보 았 다.

struct st1
{
 char name;
 double age;
 char sex;
};
//32   sizeof(struct st1) = 16
//64   sizeof(struct st1) = 24
struct st2
{
 char a;
 char b;
 char c;
};
//32  64  , sizeof(struct st2)  3   
상기 결 과 를 통 해 알 수 있 듯 이 구조 체 st1 은 32 위 에서 4 개의 바이트 에 따라 정렬 되 고 64 위 에서 8 개의 바이트 에 따라 정렬 되 며 구조 체 st2 는 32 위 든 64 위 든 모두 1 개의 바이트 에 따라 정렬 된다.
그러면 우 리 는 정렬 규칙 을 다음 과 같이 요약 할 수 있다.
4.567917.모든 구조 체 구성원 의 바이트 길이 가 운영 체제 의 기본 바이트 단위(32 비트 운영 체제 가 4,64 비트 운영 체제 가 8)를 초과 하지 않 은 상황 에서 구조 체 에서 바이트 의 가장 큰 변수 길이 에 따라 정렬 한다4.567917.만약 에 구조 체 중의 특정한 변수 바이트 가 운영 체제 의 기본 바이트 단 위 를 초과 하면 시스템 바이트 단위 에 따라 정렬 합 니 다메모:32 자리 가 아니 라 4 개의 바이트 로 정렬 하고 64 자 리 는 8 개의 바이트 로 정렬 합 니 다.
2.왜 바이트 정렬 이 있어 야 하 는가
먼저 작은 지식 을 보급 합 니 다.cpu 가 한 번 에 얼마나 많은 메모 리 를 읽 을 수 있 는 지 는 데이터 버스 가 몇 자리 인지,16 자리 라면 한 번 에 2 바이트 만 읽 을 수 있 습 니 다.32 자리 라면 4 개의 바이트 를 읽 을 수 있 고 cpu 는 메모리 구간 을 넘 어 접근 할 수 없습니다.
이러한 구조 체 가 있다 고 가정 하면 다음 과 같다.

struct st3
{
    char a;
    int b;
};
//       1      , 32    ,     8    。
주소 공간 이 다음 과 같다 고 가정 합 니 다.

바이트 가 정렬 되 지 않 은 상황 에서 변수 a 는 0x 00000001 이라는 바이트 를 차지 하고 변수 b 는 0x0000002~0x0000005 라 는 네 개의 바이트 를 차지 합 니 다.그러면 cpu 는 메모리 에서 변수 b 를 읽 으 려 면 먼저 변수 b 의 시작 주소 0x0000002 에서 0x0000004 로 읽 은 다음 에 0x0000005 라 는 바이트 를 한 번 더 읽 어야 합 니 다.int 를 읽 는 것 과 같 습 니 다.cpu 는 메모리 에서 두 번 읽 었 습 니 다.
그리고 바이트 정렬 을 하면 변수 a 는 0x 00000001 이라는 바이트 를 차지 하고 변수 b 는 0x0000005~0x00000008 이라는 네 개의 바이트 를 차지 합 니 다.그러면 cpu 는 변수 b 를 읽 으 려 면 0x0000005 에서 0x00000008 까지 한꺼번에 읽 고 한 번 에 모두 읽 습 니 다.
따라서 바이트 정렬 의 근본 적 인 원인 은 cpu 가 메모 리 를 읽 는 효율 문제 입 니 다.정렬 한 후에 cpu 가 메모 리 를 읽 는 효율 이 더욱 빨 라 집 니 다.그러나 여기 서 문제 가 있 습 니 다.바로 맞 출 때 0x 0000002~0x0000004 라 는 세 개의 바이트 가 낭비 되 기 때문에 바이트 정렬 은 실제 적 으로 공간 으로 시간 을 바 꾸 는 뜻 도 있 습 니 다.코드 를 구체 적 으로 쓸 때 어떻게 선택 하 는 지 사실은 개인 에 게 달 려 있 습 니 다.
3.수 동 설정 정렬
어떤 상황 에서 수 동 설정 정렬 이 필요 합 니까?
4.567917.서로 다른 CPU 아래 의 통신 프로 토 콜 을 설계 합 니 다.예 를 들 어 두 서버 간 에 네트워크 통신 을 하고 하나의 구조 체 를 공유 할 때 수 동 으로 정렬 규칙 을 설정 하여 양쪽 구조 체 의 길 이 를 확보 해 야 합 니 다하드웨어 드라이버 를 작성 할 때 레지스터 의 구조;수 동 설정 정렬 방식 은 두 가지 가 있 습 니 다.
코드 에 사전 컴 파일 표 지 를 추가 합 니 다:

//    
#pragma pack(n)//           n     
struct st3
{
    char a;
    int b;
};
#pragma pack()//    n     ,  #pragma pack(n)       
//    sizeof(st3)=5
위의 두 줄 은 운전 할 때 와 비슷 하 다.어느 길 로 갔 을 때 속도 제한 60km 의 표지 판 을 발 견 했 고 그 길 을 지나 면 속도 제한 60km 를 해제 하 는 표지 판이 있다.
구조 체 정의 시:

//    
struct bbb
{
   char a;
   int b;
}__attribute__((packed));//             ,         1      
//    sizeof(st3)=5

4.구조 체 비교 방법
메모리 비교 함수 memcpy 를 사용 하여 구조 체 를 비교 할 수 있 으 나 구조 체 정렬 으로 충전 위치 가 일치 하지 않 을 수 있 으 므 로 주의해 야 합 니 다.
  • 빈 자리 가 없 도록 1 개의 바이트 정렬 로 설정 합 니 다
  • 4.567917.구조 체 를 미리 초기 화 합 니 다
    
    memcpy(char *dest, const char* src, int len); //   #include<string.h>
    c 언어 구조 체 바이트 정렬 의 실현 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 c 언어 구조 체 바이트 정렬 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기