Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
헤더 파일에 정의됨 <cstddef>
typedef /*implementation-defined*/ ptrdiff_t ;

std::ptrdiff_t 는 두 포인터를 뺀 결과의 부호 있는 정수형입니다.

std::ptrdiff_t 의 비트 너비는 17 이상입니다.

(C++11부터)

목차

참고 사항

std::ptrdiff_t 는 음수 값이 가능한 경우 포인터 연산 및 배열 인덱싱에 사용됩니다. int 와 같은 다른 타입을 사용하는 프로그램은 인덱스가 INT_MAX 를 초과하거나 32비트 모듈러 연산에 의존하는 경우, 예를 들어 64비트 시스템에서 실패할 수 있습니다.

C++ 컨테이너 라이브러리를 사용할 때, 반복자 간 차이에 대한 적절한 타입은 멤버 typedef difference_type 으로, 이는 종종 std::ptrdiff_t 와 동의어입니다.

동일한 배열의 요소들(배열의 끝 바로 다음을 가리키는 포인터 포함)을 가리키는 포인터들끼리만 서로 뺄셈할 수 있습니다.

배열이 매우 커서( PTRDIFF_MAX 개 이상의 요소이지만 SIZE_MAX 바이트 미만인 경우) 두 포인터 간의 차이가 std::ptrdiff_t 로 표현될 수 없을 정도로 크다면, 이러한 두 포인터를 뺀 결과는 정의되지 않습니다.

char 배열의 길이가 PTRDIFF_MAX 보다 짧은 경우, std::ptrdiff_t std::size_t 의 부호 있는 대응 타입으로 작동합니다: 이는 모든 타입의 배열 크기를 저장할 수 있으며 대부분의 플랫폼에서 std::intptr_t 와 동의어입니다.

std::ptrdiff_t 의 선언이 다른 표준 라이브러리 헤더에서 사용 가능한지 여부는 명시되지 않습니다. 구현체는 표준에서 std::ptrdiff_t 의 사용을 요구하는 경우에도 이 이름의 도입을 피할 수 있습니다.

가능한 구현

// C++11부터 유효함
using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr));

예제

#include <cstddef>
#include <iostream>
int main()
{
    const std::size_t N = 10;
    int* a = new int[N];
    int* end = a + N;
    for (std::ptrdiff_t i = N; i > 0; --i)
        std::cout << (*(end - i) = i) << ' ';
    std::cout << '\n';
    delete[] a;
}

출력:

10 9 8 7 6 5 4 3 2 1

참고 항목

sizeof 연산자가 반환하는 부호 없는 정수형
(typedef)
표준 레이아웃 타입의 시작부터 지정된 멤버까지의 바이트 오프셋
(함수 매크로)
C 문서 for ptrdiff_t