차이

2013-11-25 3 views
4

나는 다음과 같은 코드를 가지고 : 나는 (g ++ 4.6과 우분투 -03 컴파일)이 기능, 나는 각 이중 변수 수를 실행차이

int byte_align(void * ptr) 
    { 
     int power = 2, n = 1, result = 0; 
     size_t address = reinterpret_cast<size_t>(ptr); 
     while(address%power == 0) 
     { 
      power *=2; 
      result = n; 
      n++; 
     } 
     return result; 
    } 

다른 값을 실행을 (4, 5, 7, 8). 왜? 동일한 OS 및 동일한 컴파일러를 가진 다른 PC에서 나는 결과적으로 항상 3을 얻습니다.
이러한 결과에 대한 다른 가능한 이유는 무엇입니까?
감사합니다.

+0

32 비트 또는 64 용으로 컴파일하고 있습니까? –

+2

ptr로 무엇을 전달합니까? – Reunanen

+0

@Pukku : 주소를 두 배로 전달합니다 (예 : 'double x; func (&x);' –

답변

5

순수한 기회. 기계에 따라 두 배는 을 4의 배수 또는 8의 배수 (일반 기계)에 맞추어야합니다. 8의 정렬은 3을 반환합니다. 의 16, 32, 64 ...로 정렬 된 항목도 8로 정렬됩니다.

포인터의 출처와 컨텍스트 (DLL 등)을 실행하고있는 에 더 많은 것을 말하기는 어렵습니다. 보안상의 이유로 많은 시스템에서 프로그램을 실행할 때마다 정적 데이터, 스택 및/또는 무료 주소 공간 인 을 다른 주소에 배치합니다.

0

큰 주소 공간이있는 시스템에서 변수는 4 바이트보다 큰 경계에 위치 할 수 있습니다 (32 비트 정렬의 경우).

이 샘플로 기능을 수행합니다
로 0x100, 0x101, 0x102, 난 단지 프로그램마다에 같은 장소에 위치 할 수 없습니다 말할 수 적용됨 0x104,이 적용됨 0x108, 당신은 제공된 정보에서 0x110

, 기도. 따라서 포인터는 다른 값을 가질 수 있습니다.

데이터에 대해서도 마찬가지입니다.