데이터 정렬 데이터 alignment에 대한 좋은 설명은 밑바닥 개발, 예를 들어 구동 개발을 하는 것이 중요하다. 이런 개념은 매우 중요하다.

3008 단어 Data
알파, IA-64, MIPS, 슈퍼H 시스템 기반 등 많은 CPU가 정렬되지 않은 데이터를 읽기를 거부합니다.프로그램이 그 중 하나인 CPU에 정렬되지 않은 데이터를 읽으라고 요구하면 CPU가 비정상적으로 처리되고 프로그램이 계속 실행할 수 없음을 알립니다.예를 들어 ARM, MIPS, SH 하드웨어 플랫폼에서 운영체제가 정렬되지 않은 데이터를 저장해야 할 때 기본적으로 프로그램에 이상을 알린다.
정렬
정렬성은 메모리 주소의 특성으로 메모리 주소 모드의 2의 멱으로 나타난다.예를 들어, 메모리 주소 0x0001103F 모드 4의 결과는 3입니다.이 주소는 4n+3과 정렬된다고 하는데 4는 선택한 2의 멱의 값을 가리킨다.메모리 주소의 정렬은 2에 대한 멱값에 따라 결정됩니다.같은 주소 모드 8의 결과는 7이다.
하나의 메모리 주소가 표현식 Xn+0에 부합되면, 이 주소는 X에 맞다고 합니다.
CPU 실행 명령은 메모리에 저장된 데이터를 조작하는 것으로 메모리에 주소를 표시한다.주소에 대해 말하자면, 단독 데이터는 메모리를 차지하는 바이트 수를 가지고 있다.만약 그것의 주소가 그것의 바이트 수에 맞다면, 이 데이터를 자연 정렬이라고 하고, 그렇지 않으면 정렬하지 않았다고 한다.예를 들어 8바이트를 표시하는 부동 데이터의 주소가 8에 맞으면 이 데이터는 자연히 맞춰진다.
데이터 정렬성 컴파일 처리
장치 컴파일러는 데이터가 정렬되지 않는 것을 방지하는 방식으로 데이터를 주소 분배한다.
하나의 데이터 형식에 대해 컴파일러가 분배하는 주소는 데이터 형식 바이트의 배수이다.따라서 컴파일러가 롱형 변수에 분배한 주소는 4의 배수이다. 즉, 2진법으로 주소를 표시하면 마지막 두 자리는 0이다.
또한 컴파일러는 각 구조 멤버를 자연스럽게 정렬하는 방식으로 구조체를 채운다.아래 코드 안의 구조체 struct x 를 보십시오.
Code:
Select all     struct x_
      {
            char a;     // 1 byte
            int b;      // 4 bytes
            short c;    // 2 bytes
            char d;     // 1 byte
      } MyStruct;

컴파일러는 이 구조를 자연스럽게 맞추기 위해 채웠다.
예컨대
다음 코드는 컴파일러가 메모리에 어떻게 채워졌는지 설명한다.
Code:
Select all       // Shows the actual memory layout
      struct x_
     {
           char a;            // 1 byte
           char _pad0[3];     // padding to put 'b' on 4-byte boundary
           int b;            // 4 bytes
           short c;          // 2 bytes
           char d;           // 1 byte
           char _pad1[1];    // padding to make sizeof(x_) multiple of 4
     }

두 가지 정의는sizeof(struct x)로 되어 있다연산은 12바이트로 되돌아옵니다.
두 번째 정의에는 다음과 같은 두 가지 채우기 요소가 있습니다.
*char _pad0[3] int b를 4바이트 경계에 맞추기
*char _pad1[1]구조수 그룹structx bar[3] 정렬.
충전은bar[3]의 각 변수를 자연스럽게 맞출 수 있게 한다.
다음 코드는 bar[3]의 메모리 구조를 보여 줍니다.
Code:
Select all               adr
              offset   element
------   -------
0x0000   char a;         // bar[0]
0x0001   char pad0[3];
0x0004   int b;
0x0008   short c;
0x000a   char d;
0x000b   char _pad1[1];

0x000c   char a;         // bar[1]
0x000d   char _pad0[3];
0x0010   int b;
0x0014   short c;
0x0016   char d;
0x0017   char _pad1[1];

0x0018   char a;         // bar[2]
0x0019   char _pad0[3];
0x001c    int b;
0x0020   short c;
0x0022   char d;
0x0023   char _pad1[1];

좋은 웹페이지 즐겨찾기