2011-09-06 51 views
9

C++의 메모리 정렬, 일반적인 접근법, 컴파일러의 차이점 및 일반적인 함정에 대해 좋은 (포괄적 인) 문서를 찾고 있습니다. 주제에 대한 나의 이해가 올바른지 확인하고 새로운 것을 배울 수 있습니다.다른 플랫폼/컴파일러에서 C++ 메모리 정렬에 대한 설명서는 어디에서 찾을 수 있습니까?

이 질문은 내가 다음과 같은 구문을 사용하는 또 다른 질문에 대한 내 대답에 의해 영감은 :

char const buf[1000] = ...; 
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything 

그것은 메모리 정렬 규칙을 따르지 않는 비판했다. 이 접근 방식이 메모리 정렬 관점에서 결함이있는 이유를 설명해 주시겠습니까? 예를 들어 작동하지 않을 경우 대단히 감사하겠습니다. 나는 이것이 일반적으로 나쁜 접근법이라는 것을 알고 있지만, 종종 네트워크 프로토콜 구현에 사용하기 때문에 이론적 인 것보다 더 실용적인 문제입니다.

여기에도 엄격한 별칭을 언급하지 마십시오. 다른 질문입니다.

+0

시스템의 워드 크기의 배수가 아닙니다. 32 비트 단어의 중간에있는 단어 중간에 포인터를 얻으 려하면 비판의 대상이 될 수 있습니다. –

+1

시프트가 4의 배수 인 경우에도 'buf'가 4의 배수 인 주소에서 시작한다는 보장이 없습니다 – nos

+0

'시프트'는 무엇이든 가능합니다 질문을 업데이트했습니다. –

답변

6

char의 힙이 할당되지 않은 배열에는 정렬에 대한 특정 요구 사항이 없습니다. 따라서 1000 자의 버퍼가 홀수 오프셋에있을 수 있습니다. 컴파일러가 별도의 읽기 + 비트 마스크 작업으로 분할하지 않으면 성능이 저하되거나 일부 하드웨어에서 버스 오류가 발생할 수 있습니다 (int 포인터가 명확한 것으로 다시 해석되는) 오프셋에서 int을 읽으려고하면 성능이 저하 될 수 있습니다.

char의 힙 할당 배열은 모든 개체 유형을 저장하기 위해 적절하게 정렬되므로 항상 옵션입니다.

힙이 아닌 저장소의 경우 일반 용도로 적절하게 공간이 정렬되도록 boost::aligned_storage을 사용하십시오.

+0

+1 : 안타깝게도 두 가지 답변을 수락 할 수 없으므로 주 질문에 답변 한 다른 답변을 수락해야합니다. –

0

주소가 예를 들어 PS3과 같이 16 바이트로 정렬되어야하는 경우를 상상해보십시오. 그리고 그 교대 == 1로 상상해보십시오. 이것은이 기계에서 작동하지 않는 비 16 바이트 정렬 포인터입니다.

관련 문제