2013-10-21 2 views
0

주제가 How is an array aligned in C++ compared to a type contained?에이어서 실험을했습니다.포함 된 유형에 비해 C++에서 배열이 어떻게 정렬됩니까? 2

#include<iostream> 
using namespace std; 

int main() 
{ 
    const int N = 12; 
    { 
    float p1[N], p2[N]; 

    cout << p1 << " " << p2 << " " << p2 - p1 << endl; 
    } 

    { 
    float* p1, *p2; 

     // allocate memory 
    p1 = new float[N]; 
    p2 = new float[N]; 

    cout << p1 << " " << p2 << " " << p2 - p1 << endl; 
    delete[] p1; 
    delete[] p2; 
    } 
} 

내가 그 P1과 P2는 4 바이트 정렬는 sizeof (플로트) == 것 기대 인용 된 질문 위키에 따르면 여기

는 코드입니다. 그러나 그 결과는 : N = 9, 11, 12 위치 (P2-P1)에 대한 배열 사이

0x7fff4fd2b410 0x7fff4fd2b440 12 
0x7f8cc9c03bd0 0x7f8cc9c03c00 12 

동일 (12) 거리 = 그래서이 플로트 어레이 모양 8. 정렬 16 바이트이고, n은 8이고 . 왜?

P. 내 프로세서는 인텔 코어 i7입니다

컴파일러 - g ++ 4.6.3


그것은 구조로 배열 퍼팅 하나가 10 수레 거리를 얻을 수 있다는 것을 나타납니다 operator new에 의해 할당

const int N = 10; 

struct PP{ 
    float p1[N], p2[N]; 
}; 

int main() { 

    PP pp; 
    cout << pp.p1 << " " << pp.p2 << " " << pp.p2 - pp.p1 << endl; 
} 

0x7fff50139440 0x7fff50139468 10 

답변

1

메모리 생성되는 실제 유형에 관계없이 항상 모든 객체 유형에 적합한 정렬을가집니다. 또한 성능을 향상시키기 위해 더 넓은 정렬 (예 : 캐시 라인 정렬)을 가질 수도 있습니다.

동적 배열을 자동 배열로 바꾸거나 (더 좋게도 연속적인 클래스 멤버로 만들면) 더 좁은 정렬을 볼 수 있습니다. 그렇지 않을 수도 있습니다. 객체 정렬 방법에 대한 정확한 세부 정보는 유형에 대한 최소 요구 사항을 충족하는 한 컴파일러에 달려 있습니다.

+0

알 수 있습니다. 구조체에 결합하면 10 플로트 거리가됩니다. const int N = 10; 구조체 PP { float p1 [N], p2 [N]; }; int main() { PP pp; cout << pp.p1 << ""<< pp.p2 << ""<< pp.p2 - pp.p1 << endl; } 출력 : 0x7fff50139440 0x7fff50139468 10 – klm123