c 언어 구조 체 바이트 정렬 의 실현 방법
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 를 사용 하여 구조 체 를 비교 할 수 있 으 나 구조 체 정렬 으로 충전 위치 가 일치 하지 않 을 수 있 으 므 로 주의해 야 합 니 다.
memcpy(char *dest, const char* src, int len); // #include<string.h>
c 언어 구조 체 바이트 정렬 의 실현 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 c 언어 구조 체 바이트 정렬 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.