메모리 정렬은 속도를 위해 프로그램을 최적화 할 때 매우 중요한 문제입니다. C는 일반적으로 속도에 중점을 둔 언어이므로 프로그램을 더 빠르게 만들 수있는 몇 가지 규칙을 적용하는 것이 좋습니다.
정렬 된 메모리 액세스와 정렬되지 않은 메모리 액세스의 제한은 메모리에서 데이터를 가져 오는 데 사용되는 하드웨어에서 직접 가져옵니다. 메모리에서 데이터를 가져 오는 데는 일반적으로 크기가 기계 덩어리와 같은 청크 단위로 가져옵니다. 위치 101에 저장된 더블 워드 (4 바이트)에 액세스하려고합니다. 즉, 메모리 컨트롤러가 먼저 위치 100에서 더블 워드 읽기를 수행 한 다음 위치 104에서 더블 워드를 다시 읽어야합니다. 그런 다음 위치 101, 102, 103 및 104의 개별 바이트를 함께 연결하십시오. 전체 동작은 2 클럭 사이클을 취한다.
위치 100에서 더블 워드에 액세스하려는 경우 해당 문제가 없으므로 필자가 제공 한 예제로 명확하게 설명해야합니다.
실제로 정렬되지 않은 데이터 액세스는 SSE 지침 ("정렬 된"버전, 그렇게하지 않는 "정렬되지 않은"버전도 있습니다)이 큰 문제로 액세스하려고하면 일반 보호 오류가 발생합니다 그것들과 잘못 정렬 된 데이터.
일반적으로 4 바이트 경계에 4 바이트 데이터를 정렬하거나 8 바이트 경계에 8 바이트 데이터를 정렬하는 등의 어려움이 없습니다.
0x10004566부터 시작하여 0부터 시작하여 4 바이트를 넣을 수있는 첫 번째 위치는 0x00000002에 있으므로 2 바이트의 메모리 (바이트 0x00000000 및 0x00000001)를 "낭비합니다". – pmg
의미가 있습니다. 그러나 패딩을 추가하는 것과 비교할 때 충분히 작은 2 바이트 공간은 없습니다 (많은 시간이 발생 함). –
배터리를 사고 싶다고 상상해보십시오. 그들은 8 개 팩으로 나옵니다. 그러나 여러분은 단지 7 개를 원합니다. 패킷을 열고 1 개를 제거하십시오. 다음에 다른 7 개를 원할 것입니다 ... 그래서 1 개를 남기고 다른 팩을 열고 2 개를 제거하십시오. 그래서 ... 이제 8을 얻고 1을 던질 것이라고 상상해보십시오. 다음에 또 다른 8을 얻고 다른 것을 버리면 --- --- 바이트가 배터리보다 저렴함 :) – pmg