std::ptrdiff_t(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::ptrdiff_t(3) πŸ’–

okay bestie, this is the std::ptrdiff_t(3) page from the C++ Standard Libary manual β€” yes, that’s the manual name, typo and all, and we’re about to make pointer-difference math cute πŸ’–βœ¨

πŸŽ€ NAME πŸŽ€

std::ptrdiff_t - std::ptrdiff_t

(yes, the NAME line is literally that repeat, no cap πŸ’…)

πŸ¦‹ Synopsis πŸ¦‹

Defined in header <cstddef>
typedef /*implementation-defined*/ ptrdiff_t;

std::ptrdiff_t is the signed integer type of the result of subtracting two pointers. It’s giving pointer math’s official little difference holder 🫢

The bit width of std::ptrdiff_t is not less than 17. (since C++11) ⭐

πŸ’… Notes πŸ’…

std::ptrdiff_t is used for pointer arithmetic and array indexing, if negative values are possible. Programs that use other types, such as int, may fail on, e.g. 64-bit systems when the index exceeds INT_MAX or if it relies on 32-bit modular arithmetic. So yeah, this is not the moment to be quirky with int, bestie 😭

When working with the C++ container library, the proper type for the difference between iterators is the member typedef difference_type, which is often synonymous with std::ptrdiff_t.

Only pointers to elements of the same array (including the pointer one past the end of the array) may be subtracted from each other. That’s the rule, periodt 🚨

If an array is so large (greater than PTRDIFF_MAX elements, but less than SIZE_MAX bytes), that the difference between two pointers may not be representable as std::ptrdiff_t, the result of subtracting two such pointers is undefined. Like, do not do this πŸ™ˆπŸ’€

For char arrays shorter than PTRDIFF_MAX, std::ptrdiff_t acts as the signed counterpart of std::size_t: it can store the size of the array of any type and is, on most platforms, synonymous with std::intptr_t.

It is unspecified whether the declaration of std::ptrdiff_t is available in any other standard library header. An implementation may avoid introducing this name even when the standard requires std::ptrdiff_t to be used. So don’t assume it’s gonna pop up everywhere like an uninvited group-chat notification πŸ‘€

✨ Possible implementation ✨

// valid since C++11
using ptrdiff_t = decltype(static_cast<int*>(nullptr) -
static_cast<int*>(nullptr));

🌈 Example 🌈

// Run this code

#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;
}

Output:

10 9 8 7 6 5 4 3 2 1

πŸ‘‘ See also πŸ‘‘

  • size_t β€” unsigned integer type returned by the sizeof operator (typedef)
  • offsetof β€” byte offset from the beginning of a standard-layout type to specified member (function macro)
  • C documentation for ptrdiff_t

mwah πŸ’‹ this page is from http://cppreference.com, dated 2024.06.10, and it’s the std::ptrdiff_t(3) manual page β€” love u, bye bestie! πŸŽ€πŸ¦‹πŸ’œ

πŸ“¦ where this page comes from