intr_t의 용도는 무엇입니까?
데이터 손실 없이 포인터로 캐스트/캐스팅할 수 있는 정수형이라는 것을 알고 있습니다만, 굳이 이 작업을 해야 하는 이유는 무엇입니까?, 「정수 타입」보다 어떤 이점이 .void*
및 '''를 잡기 THE_REAL_TYPE*
인터터 산? ??
★★★★
"이미 질문되었습니다"라고 표시된 질문은 이에 대한 답이 아닙니다.서 문제는 '서 쓰느냐' 입니다.intptr_t
void*
좋은 아이디어입니다.그 답변은 「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_t
type은 메모리 관리 코드를 작성할 때 매우 유용합니다. 포인터일반 포인터)의 관점에서 .void *
내부적으로는 주소의 모든 종류의 계산을 실시합니다.
, , 하다, 하다, 하다, 하다, 할 수 요.char *
하지만 전부는 아니었고, 결과는 Ansi C 이전처럼 보입니다.
에 따라서는, 반드시 메모리 관리 코드로 메모리 관리 코드가 사용되는 것은 .uintptr_t
들어 는 a - 예 BSD를 정의합니다.vm_offset_t
비슷한 성질을 가지고 있습니다.그러나 debug malloc 패키지 등을 쓰고 있다면 왜 자신의 유형을 발명해야 합니까?
'아예'가 있을 %p
printf
는 다양한 아키텍처에서 포인터 크기의 정수 변수를 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
'programing' 카테고리의 다른 글
네이티브 Java 또는 Kotlin에서 "의존관계 AAR 메타데이터에 지정된 minCompileSdk(31)" 오류를 해결하려면 어떻게 해야 합니까? (0) | 2022.07.16 |
---|---|
Java EE 웹 응용 프로그램에서 WEB-INF는 무엇에 사용됩니까? (0) | 2022.07.16 |
메서드 자체에 의해 값이 변경되었을 때 vuejs 워치 메서드의 트리거를 정지할 수 있는 방법이 있습니까? (0) | 2022.07.16 |
Vue js v-model different 확인란 (0) | 2022.07.16 |
C프로그래밍을 하는 동안과 비교해서? (0) | 2022.07.16 |