32 및 64 비트 아키텍처 모두에 휴대 할 수있는 작문 코드를위한 포인트

StackOverflow https://stackoverflow.com/questions/2254222

  •  20-09-2019
  •  | 
  •  

문제

32 비트와 64 비트 머신에서 휴대 할 수있는 코드를 작성하는 동안 명심해야 할 사항은 무엇입니까?

이것에 대해 더 생각하면, 당신이 직면 한 문제의 경험을 추가 할 수 있다면 도움이 될 것입니다.

이것에 더 추가하면 한 번은 포인터를 반환하는 기능에 대한 프로토 타입이 누락되어 문제에 직면했습니다. 64 비트 머신에 동일하게 포팅했을 때 코드가 충돌하고 있었고 꽤 오랫동안 이유에 대한 단서가 없었으며 나중에 누락 된 모든 프로토 타입이 문제를 일으키는 Int를 반환하는 것으로 가정했습니다.

그러한 예제는 도움이 될 수 있습니다.

편집 : 커뮤니티 위키에 추가.

도움이 되었습니까?

해결책

gotchas :

  1. 정수 유형에 포인터를 캐스팅하는 것은 위험합니다
  2. 데이터 구조 크기가 변경 될 수 있습니다
  3. 사인 확장을 조심하십시오
  4. 다른 ABI?

도움이 된 몇 가지 팁 및 요령 :

  1. 네이티브 크기의 정수 유형 (헤더 또는 typedef 크기에 관심이없는 변수가있을 때 사용하십시오.
  2. 가능한 경우 명시 적 변수 유형을 사용하십시오 (u_int64_t, int_32_t 등).

다른 팁

  • 일부 적분 유형마다 크기가 다를 수 있습니다
  • 포인터는 길이가 다릅니다
  • 구조 패딩
  • 조정

Windows에는 일반 X32 기계의 배수와 달리 X64에 대한 통화 대회 만 있습니다.

32 비트와 약 64 비트의 구성 요소가 있으면 상황이 더 어두워집니다. Windows에서 나는 그들이 대화를 나누기 위해 COM 서비스를 작성하게되었습니다.

포인터를 스택으로 밀면 두 배나 많은 공간이 차지합니다. 스택 크기는 OS 버전간에 변경되지 않을 수 있으므로 32 비트에서 정상적으로 실행되는 코드가 컴파일되면 64 비트에서 변경되지 않고 실행됩니다. 내가 이것을 어떻게 아는지 묻지 마세요.

sizeof (int) may! = sizeof (void*)

조정. 정렬 요구가 변경 될 수 있습니다. 이렇게하면 정렬되어야했지만 32 비트 (또는 신경 쓰지 않는 프로세서)에서만 우연히 정렬 된 버그를 노출시킬 수 있습니다.

수신기가 포인터를 기대하는 경우 0을 Varargs로 전달하지 마십시오. 이것은 Savvy Devs가 0이 유효한 널 포인터라는 것을 알고있는 C ++에서 고통 스럽습니다. AC Dev는 보통 NULL을 사용하므로 아마도 괜찮을 것입니다.

자동 테스트를 작성하고 두 플랫폼에서 정기적으로 실행하십시오.

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