programing

void* 대신 intptr_t를 사용?

codeshow 2023. 10. 24. 21:39
반응형

void* 대신 intptr_t를 사용?

사용하는 것이 좋습니까?intptr_t대신에 범용 저장소(포인트와 정수 값을 유지하기 위해)로서.void*? (여기서 보는 것처럼: http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)

이미 읽은 내용:

  • int->void*->int왕복은 원래의 가치를 보장하지 않습니다. 아마도.int->intptr_t->int할 거다.
  • 양자 모두에 대한 포인터 산술void*그리고.intptr_t깁스가 필요해서 아무도 여기서 이득을 얻지 못합니다.
  • void*포인터를 저장할 때 덜 명시적인 캐스트를 의미합니다.intptr_t정수 값을 저장할 때 캐스트 수가 적음을 의미합니다.
  • intptr_tC99가 필요합니다.

그 외에 고려해야 할 사항은 무엇입니까?

사용하는 것이 좋습니까?intptr_t대신에 범용 저장소(포인트와 정수 값을 유지하기 위해)로서.void*?

아니요.

intptr_t존재가 보장되지 않습니다.첫째, 당신이 주목하신 것처럼, 그것은 C99에 도입되었습니다.둘째, 정보의 손실 없이 변환된 포인터 값을 유지할 수 있을 만큼 충분히 큰 정수 타입을 가질 필요는 없습니다.

변환하기int로.intptr_t정보를 잃을 가능성은 낮지만, 그에 대한 확실한 보장은 없습니다.intptr_t보다 넓은int.

포인터 값을 저장하려면 포인터 개체에 저장합니다.그것이 포인터 개체의 용도입니다.

개체 또는 불완전한 유형에 대한 포인터는 다음으로 변환할 수 있습니다.void*정보의 손실 없이 다시 돌아올 수 있습니다.함수에 대한 포인터에 대해서는 이러한 보장이 없지만, 어떤 포인터 대 함수 유형이든 다른 포인터 대 함수 유형으로 정보 손실 없이 변환할 수 있습니다.(C 표준을 말하는 것인데, POSIX는 몇 가지 추가적인 보장을 제공한다고 생각합니다.)

정수 또는 포인터 값을 동일한 개체에 저장하려면 가장 먼저 설계를 다시 생각해 보는 것이 좋습니다.이미 그렇게 했고 정말로 그렇게 하고 싶다고 결론을 내렸다면 조합을 사용하는 것을 고려해 보십시오(그리고 가장 최근에 저장한 가치가 무엇인지 주의 깊게 추적해야 합니다).

a를 사용하는 API들이 있습니다.void*임의 데이터를 전달할 수 있도록 하는 인수입니다. 예를 들어 POSIX 함수를 참조하십시오.이는 정수 값을 다음에 캐스팅함으로써 악용될 수 있습니다.void*하지만 정수 개체의 주소를 전달하는 것이 더 안전합니다.

아니요, 특정 유형이 포인터와 정수를 모두 저장하는 합리적인 방법이라고 보장할 수는 없습니다. 게다가 코드를 혼란스럽게 만듭니다.더 좋은 방법이 있습니다.

정수와 포인터를 동일한 개체에 저장하려면 깨끗하고 휴대하기 쉬운 방법으로 유니언을 사용합니다.

union foo {
   int integer_foo;
   void *pointer_foo;
};

이것은 휴대가 가능하며 두 가지 중 큰 것에 필요한 스토리지 크기로 두 가지 종류의 물건을 모두 저장할 수 있습니다.그것은 항상 작동할 것을 보장합니다.

언급URL : https://stackoverflow.com/questions/9492798/using-intptr-t-instead-of-void

반응형