2012-01-17 2 views
2

구조체 패딩이 구조체가 memcmp와 비교 될 수없는 이유는 무엇인지 이해하려고했습니다. 내가 구조 패딩에 대한 이해 해달라고 하나 개의 작은 것은 이것이다 ... 왜 "a short be 2 byte aligned" 또는 "a long be 4 byte aligned"는. 나는 그 크기와 이해합니다 그런데 왜 그들은 어떤 바이트 경계에 나타나지 않을 수 있습니까?구조체 덧씌우기

또는 다른 말로 "why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"을에를

+1

0x10004566부터 시작하여 0부터 시작하여 4 바이트를 넣을 수있는 첫 번째 위치는 0x00000002에 있으므로 2 바이트의 메모리 (바이트 0x00000000 및 0x00000001)를 "낭비합니다". – pmg

+0

의미가 있습니다. 그러나 패딩을 추가하는 것과 비교할 때 충분히 작은 2 바이트 공간은 없습니다 (많은 시간이 발생 함). –

+5

배터리를 사고 싶다고 상상해보십시오. 그들은 8 개 팩으로 나옵니다. 그러나 여러분은 단지 7 개를 원합니다. 패킷을 열고 1 개를 제거하십시오. 다음에 다른 7 개를 원할 것입니다 ... 그래서 1 개를 남기고 다른 팩을 열고 2 개를 제거하십시오. 그래서 ... 이제 8을 얻고 1을 던질 것이라고 상상해보십시오. 다음에 또 다른 8을 얻고 다른 것을 버리면 --- --- 바이트가 배터리보다 저렴함 :) – pmg

답변

3

메모리 정렬은 속도를 위해 프로그램을 최적화 할 때 매우 중요한 문제입니다. C는 일반적으로 속도에 중점을 둔 언어이므로 프로그램을 더 빠르게 만들 수있는 몇 가지 규칙을 적용하는 것이 좋습니다.

정렬 된 메모리 액세스와 정렬되지 않은 메모리 액세스의 제한은 메모리에서 데이터를 가져 오는 데 사용되는 하드웨어에서 직접 가져옵니다. 메모리에서 데이터를 가져 오는 데는 일반적으로 크기가 기계 덩어리와 같은 청크 단위로 가져옵니다. 위치 101에 저장된 더블 워드 (4 바이트)에 액세스하려고합니다. 즉, 메모리 컨트롤러가 먼저 위치 100에서 더블 워드 읽기를 수행 한 다음 위치 104에서 더블 워드를 다시 읽어야합니다. 그런 다음 위치 101, 102, 103 및 104의 개별 바이트를 함께 연결하십시오. 전체 동작은 2 클럭 사이클을 취한다.

위치 100에서 더블 워드에 액세스하려는 경우 해당 문제가 없으므로 필자가 제공 한 예제로 명확하게 설명해야합니다.

실제로 정렬되지 않은 데이터 액세스는 SSE 지침 ("정렬 된"버전, 그렇게하지 않는 "정렬되지 않은"버전도 있습니다)이 큰 문제로 액세스하려고하면 일반 보호 오류가 발생합니다 그것들과 잘못 정렬 된 데이터.

일반적으로 4 바이트 경계에 4 바이트 데이터를 정렬하거나 8 바이트 경계에 8 바이트 데이터를 정렬하는 등의 어려움이 없습니다.

4

일부 플랫폼 (즉, CPU가) 물리적으로 "잘못 정렬은"메모리 액세스를 지원하지 않습니다. 다른 플랫폼하지만 훨씬 느린 방식으로 그들을 지원합니다.

을 당신이 구조체에서 얻는 패딩에 의존하기 때문에 귀하의 컴파일러가하는 선택 사항을 만족 시키려면 그러한 선택을 할 것입니다. 코드가 목표로 삼는 CPU의 특정 요구 사항

1

내가 생각할 수있는 유일한 추가 예제는 데이터 전송, 데이터 전송 (아키텍처에 따라 다름)이 예를 들어 32 바이트 블록으로 이루어지며 데이터가 경계를 넘을 경우 2 전송보다는 데이터를 받기 위해 전송합니다.