2

#pragma pack (n)을 사용하여 데이터 멤버를 정렬하려고합니다. 예를 들어 다음을 보자 #pragma pack (16) 및 #pragma pack (8)과 항상 동일한 효과가 나타 납니까?

#include <iostream> 
using namespace std; 

#pragma pack(8) // or (16) 

struct A 
{ 
    int a; 
    char b; 
    char c; 
    char d; 
    char e; 
    char f; 
    double g; 
}; 
int main() 
{ 
    cout << sizeof(A) << endl; 

    return 0; 
} 

이 모두 #pragma pack(8)#pragma pack(16)에 대한 24을 인쇄합니다. 다음과 같이 나는 나의 이해의 데이터 정렬과 n=8에 대한 결과를 이해할 수 :

Bytes: |1 2 3 4|5|6|7|8|9|10 11 12 13 14 15 16|17 18 19 20 21 22 23 24| 
Data: |a  |b|c|d|e|f|padding    |g      | 

을하지만 결과는 n=16 여전히 24 왜 나는 이해할 수 없다. 다른 예제를 시도해 보았는데, 모두 같은 결과가 n=8n=16 인 것으로 보입니다. 왜 누군가가 설명 할 수 있습니까? 데이터 멤버가 n=8과 같은 방법으로 정렬되어 있습니까?

p .: VS2010에서 Win-x64로 테스트되었습니다. 페이지에서

답변

5

당신은 연결에 :

회원의 정렬이 n 인 여러 이하 중 회원의 크기의 배수 중 하나 인 경계에있을 것입니다.

각 구성원에 대해 구성원의 최적 정렬과 팩 값 사이의 최소 정렬을 취합니다. 유형의 최적의 정렬이 있기 때문에 귀하의 예제에서 회원에 관계없이 pack(8)pack(16)의 정확히 같은 정렬 모든 미만 16

당신이 __m128 등 16 바이트 정렬을 필요로하는 회원을 가지고 있다면, 당신은 것 다른 결과를 찾을 수 있어야합니다.

+0

감사합니다. 지금은 의미가 있습니다. *'각 멤버에 대해 참조 할 수있는 위치는 멤버의 최적 정렬과 팩 값 사이의 최소 정렬입니다. *? – herohuyongtao

+1

'pragma pack'은 컴파일러 확장입니다. 유일한 참고 자료는 링크 된 페이지 일 것입니다. 제가 인용 한 부분은 본질적으로 그것을 말합니다. –

2

pack은 필요할 때 사용되는 최대 정렬을 지정하기 때문에. 16 바이트보다 작은 값은 큰 값으로 정렬 할 때 이득이 없으므로 더 작은 값으로 정렬됩니다. 따라서 32 비트 정수는 여전히 4 바이트로 정렬됩니다. double은 8 바이트로 정렬됩니다. 따라서 4와 8 사이를 전환 할 때 차이가 발생할 수 있습니다.

3

pack의 경우 많은 것을 의미하기 때문에 해당 구조체에 적어도 사용자가 지정하는 N만큼의 멤버가 있어야합니다.

#include <iostream> 
using namespace std; 

#pragma pack(push) 
#pragma pack(1) 

struct A 
{ 
    char a; 
    double b; 
}; 
#pragma pack(8) 
struct B 
{ 
    char a; 
    double b; 
}; 
#pragma pack(pop) 

int main() 
{ 
    cout << sizeof(A) << "\n" << sizeof(B) << endl; 
    return 0; 
} 
내 컴퓨터에서

이 인쇄 : 예를 들어 나는 (적어도 처음에 pragma pack을 받아 시스템에 대해) 매우 일반적인 생각 하는데요

9  
16 

....