programing

intr_t의 용도는 무엇입니까?

shortcode 2022. 7. 16. 15:00
반응형

intr_t의 용도는 무엇입니까?

데이터 손실 없이 포인터로 캐스트/캐스팅할 수 있는 정수형이라는 것을 알고 있습니다만, 굳이 이 작업을 해야 하는 이유는 무엇입니까?, 「정수 타입」보다 어떤 이점이 .void* 및 '''를 잡기 THE_REAL_TYPE*인터터 산? ??

★★★★
"이미 질문되었습니다"라고 표시된 질문은 이에 대한 답이 아닙니다.서 문제는 '서 쓰느냐' 입니다.intptr_tvoid*좋은 아이디어입니다.그 답변은 「intr_t를 사용하지 말아 주세요」라고 생각되기 때문에, 제 질문은 아직 유효합니다.의 적절한 사용 사례는 무엇입니까?intptr_t

이유는, 「비트로 할 수 없습니다」라고 것은, 「 동작할 수 라고 하는 것입니다.void *, ㄴ, 은, 은, 같, 같, 습, 습, 습, 습, 습, 습, 습, ,, ,, ,, ,.intptr_t.

대해 가 있는 , 많은, 「」를 사용할 수 있습니다.intptr_t.

비트 동작의 , 는 「」, 「」, 「」를 사용하는 것입니다.unsigned 「」,uintptr_t.

@chux의 다른 답변에서도 언급했듯이 포인터 비교도 중요한 측면입니다.

「FWIW」에 , FWIWC11 「」, 「7.20.1.4」, 「7.20.1.4」,

이러한 유형은 옵션입니다.

의미론적인 고려도 있습니다.

A void*무언가를 가리켜야 합니다.현대의 실용성에도 불구하고 포인터는 메모리 주소가 아닙니다.보통/아마도/항상(!)이 들어있지만 숫자가 아니에요포인터예요.사물을 말합니다.

A intptr_t지지 it it it it it it a a a a a a a a,,, API로 패킹하여 에서 안전하게 할 수입니다.pthread★★★★★★★★★★★★★★★★★」

그래서 더 많고 작은 일을 할 수 있는 거죠intptr_t 할 수 있는 void*및 작업에 적합한 유형을 사용하여 자가 학습해야 하는 이유.

최종적으로는 거의 모든 이 정수일 수 있습니다(컴퓨터는 숫자로 동작합니다!).포인터는 정수일 수 있습니다.하지만 그렇지 않다.그것들은 다른 용도를 위해 만들어진 것이기 때문에 지침이다.그리고 이론적으로는 숫자가 아닌 다른 것일 수 있습니다.

uintptr_ttype은 메모리 관리 코드를 작성할 때 매우 유용합니다. 포인터일반 포인터)의 관점에서 .void *내부적으로는 주소의 모든 종류의 계산을 실시합니다.

, , 하다, 하다, 하다, 하다, 할 수 요.char *하지만 전부는 아니었고, 결과는 Ansi C 이전처럼 보입니다.

에 따라서는, 반드시 메모리 관리 코드로 메모리 관리 코드가 사용되는 것은 .uintptr_t들어 는 a - 예 BSD를 정의합니다.vm_offset_t비슷한 성질을 가지고 있습니다.그러나 debug malloc 패키지 등을 쓰고 있다면 왜 자신의 유형을 발명해야 합니까?

'아예'가 있을 %pprintf는 다양한 아키텍처에서 포인터 크기의 정수 변수를 16진수로 인쇄해야 하는 코드를 기술하고 있습니다.

intptr_t의 변경에 관한 한,하지 않습니다 passing that passing passing portable code that passing passing passing passing)-Wall -Werror모든 관련 아키텍처에 대해 다소 어려움이 있을 수 있습니다.)

(u)intptr_t는 포인터의 연산, 특히 비트 연산을 수행할 때 사용됩니다.하지만 다른 사람들이 말하듯, 당신은 거의 항상 이 제품을 사용하고 싶어할 것이다.uintptr_t비트 연산은 서명되지 않은 상태에서 더 잘 수행되기 때문입니다.단, 산술적 오른쪽 시프트를 수행해야 하는 경우 를 사용해야 합니다.보통 포인터에 데이터를 저장하는 데 사용되며, 보통 태그 부착 포인터라고 합니다.

  • x86-64에서는 상위 16/7비트를 데이터에 사용할 수 있지만 현재 ARM과 같이 상위 비트를 무시하는 플래그가 없기 때문에 포인터를 표준으로 만들려면 수동으로 서명 확장을 수행해야 합니다.예를 들면,char* address하기 전에 이

    char* pointer = (char*)((intptr_t)address << 16 >> 16);
    
  • 32비트 Chrome V8 엔진은 smi(작은 정수) 최적화를 사용합니다. 여기서 낮은 비트는 다음을 나타냅니다.

                |----- 32 bits -----|
    Pointer:    |_____address_____w1| # Address to object, w = weak pointer
    Smi:        |___int31_value____0| # Small integer
    

    따라서 포인터의 최하위 비트가 0일 경우 원래 31비트 서명된 int를 가져오기 위해 오른쪽으로 이동합니다.

    int v = (intptr_t)address >> 1;
    

상세한 것에 대하여는, 을 참조해 주세요.


은 부호 때 입니다.void* 함수나 .

void* my_thread(void *arg)
{
     intptr_t val = (intptr_t)arg;
     // Do something
}

int main()
{
    pthread_t thread1;
    intptr_t some_val = -2;
    int r = pthread_create(&thread1, NULL, my_thread, (void*)some_val);
}

intr_t의 용도는 무엇입니까?

사사예 : 주비비비비주 。
평등을 위한 포인터를 비교하는 것은 문제가 되지 않는다.
다음과 같은 기타 비교 작업>, <=UB. 6.5.8 연산자C11dr 6.5.8/5 입니다.
래래 to to to로 해 주세요.intptr_t 번째

[편집] 새로운 예: 포인터의 배열을 포인터 값으로 정렬합니다.

int ptr_cmp(const void *a, const void *b) {
  intptr_t ia = (intptr) (*((void **) a));
  intptr_t ib = (intptr) (*((void **) b));
  return (ia > ib) - (ia < ib);
}

void *a[N];
...
qsort(a, sizeof a/sizeof a[0], sizeof a[0], ptr_cmp);

[이전 예] 사용 예:포인터가 포인터 배열인지 테스트합니다.

#define N  10
char special[N][1];

// UB as testing order of pointer, not of the same array, is UB.
int test_special1(char *candidate) {
  return (candidate >= special[0]) && (candidate <= special[N-1]);
}

// OK - integer compare
int test_special2(char *candidate) {
  intptr_t ca = (intptr_t) candidate;
  intptr_t mn = (intptr_t) special[0];
  intptr_t mx = (intptr_t) special[N-1];
  return (ca >= mn) && (ca <= mx);
}

@M.M.의 코멘트에 의하면, 상기의 코드는 의도대로 동작하지 않는 경우가 있습니다.하지만 적어도 UB는 아닙니다.휴대용으로 사용할 수 없는 기능일 뿐입니다.나는 이 문제를 해결하기 위해 이것을 사용하고 싶었다.

언급URL : https://stackoverflow.com/questions/35071200/what-is-the-use-of-intptr-t

반응형