문제

예를 들어, 긴 변수를 선언하면 항상 "sizeof(long)" 경계에 정렬된다고 가정할 수 있습니까?Microsoft Visual C++ 온라인 도움말에 그렇게 나와 있지만 이것이 표준 동작입니까?

추가 정보:

ㅏ.잘못 정렬된 정수(*bar)를 명시적으로 생성하는 것이 가능합니다.

char foo[5]

int * bar = (int *)(&foo[1]);

비.분명히 #pragma pack()은 구조, 클래스 및 공용체에만 영향을 미칩니다.

씨.MSVC 문서에는 POD 유형이 해당 크기에 맞춰 정렬되어 있다고 명시되어 있습니다(그러나 항상 그런 것인지 아니면 기본적으로 발생하는지, 표준 동작인지는 모르겠습니다).

도움이 되었습니까?

해결책

다른 사람들이 언급했듯이 이는 표준의 일부가 아니며 문제의 프로세서에 적합하다고 판단되는 대로 구현하는 것은 컴파일러에 달려 있습니다.예를 들어 VC는 x86 프로세서에 비해 ARM 프로세서에 대해 다양한 정렬 요구 사항을 쉽게 구현할 수 있습니다.

Microsoft VC는 기본적으로 #pragma pack 지시문 또는 /Zp 명령줄 옵션으로 지정된 크기까지 자연 정렬이라고 하는 기능을 구현합니다.즉, 예를 들어 크기가 8바이트보다 작거나 같은 모든 POD 유형은 해당 크기에 따라 정렬됩니다.더 큰 것은 8바이트 경계에 정렬됩니다.

다양한 프로세서와 다양한 컴파일러에 대한 정렬을 제어하는 ​​것이 중요한 경우 패킹 크기를 1로 사용하고 구조를 채울 수 있습니다.

#pragma pack(push)
#pragma pack(1)    
struct Example
{
   short data1;     // offset 0
   short padding1;  // offset 2
   long data2;      // offset 4
};
#pragma pack(pop)

이 코드에서는 padding1 변수는 data2가 자연스럽게 정렬되었는지 확인하기 위해서만 존재합니다.

다음에 대한 답변:

예, 이로 인해 데이터 정렬이 잘못될 수 있습니다.x86 프로세서에서는 전혀 문제가 되지 않습니다.다른 프로세서에서는 이로 인해 충돌이 발생하거나 실행 속도가 매우 느려질 수 있습니다.예를 들어 Alpha 프로세서는 OS에서 포착하는 프로세서 예외를 발생시킵니다.그런 다음 OS는 명령을 검사한 다음 잘못 정렬된 데이터를 처리하는 데 필요한 작업을 수행합니다.그런 다음 실행이 계속됩니다.그만큼 __unaligned x86이 아닌 프로그램에 대한 정렬되지 않은 액세스를 표시하기 위해 VC에서 키워드를 사용할 수 있습니다(예:힘).

다른 팁

기본적으로 그렇습니다.그러나 pack() #pragma를 통해 변경할 수 있습니다.

나는 C++ 표준이 이와 관련하여 어떤 요구 사항도 제시하지 않고 이를 구현에 맡긴다고 생각합니다.

C 및 C++에서는 어떤 종류의 정렬도 요구하지 않습니다.그러나 자연 정렬은 x86에서 강력하게 선호되며 필수의 대부분의 다른 CPU 아키텍처와 컴파일러는 일반적으로 CPU를 만족시키기 위해 최선을 다합니다.따라서 실제로 팔을 비틀지 않는 한 컴파일러가 잘못 정렬된 데이터를 생성하는 것을 볼 수 없습니다.

예, 모든 유형은 항상 최소한의 정렬 요구 사항에 맞춰 정렬됩니다.

그렇지 않으면 어떻게 될 수 있습니까?

그러나 유형의 sizeof()는 정렬과 동일하지 않습니다.

다음 매크로를 사용하여 유형의 정렬 요구 사항을 결정할 수 있습니다.

#define ALIGNMENT_OF( t ) offsetof( struct { char x; t test; }, test )

컴파일러, pragma 및 최적화 수준에 따라 다릅니다.최신 컴파일러를 사용하면 시간 또는 공간 최적화를 선택할 수도 있으며 이를 통해 유형 정렬도 변경할 수 있습니다.

일반적으로 읽기/쓰기가 더 빠르기 때문입니다.그러나 거의 모든 컴파일러에는 이 기능을 끌 수 있는 스위치가 있습니다.gcc에서는 -malign-???.집계를 사용하면 일반적으로 내부 각 요소의 정렬 요구 사항에 따라 정렬되고 크기가 조정됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top