2017-04-11 17 views
-2

다음 코드 WTH 2 개 질문 :구조체/클래스가 메모리 패딩에 어떻게 영향을 줍니까?

struct Value 
{ 
    int value 
} 

void main() 
{ 
    Value v1; 
    Value v2; 

    int a; 
    int b; 

    return 0; 
} 

1) 왜 변수의 메모리 ADRESS는 아래 기능에 저장됩니다?
V1 -> 0x00007fff5fbff758
V2 ->

하지만 내 구조체의 예를 들어 그들은 다른 방향에 저장됩니다 0x00007fff5fbff750? 예 : Value에 다른 변수가있는 경우 int value_2;

v1.value -> 0x00007fff5fbff750
v2.value_2 -> 0x00007fff5fbff754

2) 이유 INT A 및 메모리 B INT 인접 이유 V1 및 V2 메모리에서 연속이 아니다.

어떤 종류의 정렬을 모르고 있습니까?

+1

C 또는 C++? 그들은 다르다. 그리고 C는'클래스 '를 가지지 않는다. – NathanOliver

+0

패딩을 할 수도 있고하지 않을 수도 있습니다. 변수는 임의의 순서로 저장할 수 있습니다. 이 모든 것은 완전히 구현에 달려 있습니다. –

+1

코드에는 'value_2'이 (가) 없습니다. –

답변

0

1) 변수가 저장되는 순서를 결정하는 컴파일러입니다. 왜 함수 변수가 스택에 푸시 다운 순서로 저장 되더라도 v1이 먼저 푸시되고 v2가 눌려지면 v2가 v1보다 아래에 있음을 알 수있는 특별한 이유는 없습니다.

반면 구조체 내의 순서는 선언 (C 사양의 어딘가에 있음)을 따라야합니다. 그 이유는 구조체가 배열이나 다른 메모리 매핑 된 영역을 오버레이 할 수 있기 때문입니다. 변수가 특정 순서와 정렬에 있는지 확인하려는 경우입니다.

2) 확실하지 않지만 컴파일러가 최적화를 위해 구조를 8 바이트 경계에 정렬하기로 결정했을 수 있습니다 (64 비트 컴파일러를 사용하는 것처럼 보입니다. 따라서 8 바이트는 '자연스러운'정렬입니다).

+0

8byte 정렬은 사실로 보입니다. 8bytes를 초과하면 16byte가됩니다 이 정렬은 왜 구조의 정렬과 다른가요? 까지 구조체 변수가 '가장 큰 유형'으로 정렬되어 있음 – Sleicreider

+0

이 8 바이트 정렬은 캐시 라인에도 영향을 줍니까? 내 개체는 4 바이트 만 사용하지만 8 바이트는 정렬되어 있으므로 (최적화의 경우) 실제로 캐시 라인의 공간이 낭비되는 것입니까? – Sleicreider

+0

캐시 라인이 레지스터 너비에 대해 최적화되어 있거나 캐시 라인에 대해 구조가 최적화되어 있다고 가정 할 수 있습니다. 그러나 이것은 모두 "컴파일러 최적화"라고하는 어두운 부두의 일부입니다. 그렇습니다. 4 바이트를 낭비하지만 성능이 향상 될 것입니다. 필요한 경우 작은 구조를 강제하는 __pragma__ 옵션이있을 수 있습니다. – JvO