정렬 (a 약사).
과거 컴퓨터에는 8 비트 데이터 버스가있었습니다. 이것은 각 클럭 사이클에서 8 비트의 정보가 처리 될 수 있음을 의미합니다. 그 때 괜찮 았어.
그런 다음 16 비트 컴퓨터가 나타납니다. 하위 호환성 및 기타 문제로 인해 8 비트 바이트가 유지되고 16 비트 워드가 도입되었습니다. 각 단어는 2 바이트였습니다. 그리고 각 클록 사이클의 16 비트 정보가 처리 될 수 있습니다. 그러나 이것은 작은 문제를 야기했다. 메모리 맵에서
살펴 보자 :
+----+
|0000|
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |
각 주소에서 개별적으로 액세스 할 수있는 바이트가있다. 그러나 단어는 짝수 주소에서만 가져올 수 있습니다. 따라서 0000에서 한 단어를 읽으면 0000과 0001의 바이트를 읽습니다. 그러나 0001 위치의 워드를 읽으려면 두 개의 읽기 액세스가 필요합니다. 처음 0000,0001 다음 00020003 그리고 우리는 단지 0001,0002 만 유지합니다.
물론 이것은 약간의 시간이 걸렸습니다. 그래서 그것이 그들이 정렬을 발명 한 이유입니다. 따라서 우리는 단어 경계에서 단어 변수를 저장하고 바이트 경계에서 바이트 변수를 저장합니다. 재미없는
+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+
: 우리가 바이트 필드 (B) 및 워드 필드 (W) (매우 순진 컴파일러)와 구조가있는 경우
예를 들어, 우리는 다음과 같은 수 . 그러나 단어 맞춤을 사용할 때 다음을 찾습니다.
+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+
여기서 액세스 속도는 메모리를 희생합니다.
더블 워드 (4 바이트) 또는 쿼드 워드 (8 바이트)를 사용할 때 이것이 훨씬 더 중요하다고 생각할 수 있습니다. 그렇기 때문에 대부분의 최신 컴파일러에서 프로그램을 컴파일하는 동안 어떤 정렬을 사용할지 선택할 수 있습니다.
다른 사람들은 스택 정렬이 무엇이고 왜 사용되는지 설명 했으므로 _ "컴파일러 설정으로 제어 할 수 있습니까?"라는 두 개의 센트를 추가하려고합니다. [이 질문] 참조 (http://stackoverflow.com/questions/5496045/why-is-my-stack-pointer-only-incrementing-in-multiples-of-16?lq=1) – andreee