Чем определяется размер указателя в C++?

«Чем определяется размер указателя в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер указателя в C++ определяется разрядностью целевой платформы (архитектуры), так как указатель должен быть способен адресовать всё виртуальное адресное пространство процесса.

  • На 32-битных (x86) системах размер указателя обычно составляет 4 байта (32 бита), что позволяет адресовать до 4 ГБ памяти.
  • На 64-битных (x86-64, ARM64) системах размер указателя обычно составляет 8 байт (64 бита).

Ключевые моменты:

  • Размер указателя не зависит от типа данных, на который он указывает (int*, char*, MyClass*).
  • Размер указателя на функцию или указателя на член класса может отличаться от размера указателя на данные, но это зависит от ABI (Application Binary Interface) компилятора и платформы.

Пример:

#include <iostream>

int main() {
    std::cout << "Platform pointer sizes:n";
    std::cout << "sizeof(int*):      " << sizeof(int*)      << " bytesn";
    std::cout << "sizeof(double*):   " << sizeof(double*)   << " bytesn";
    std::cout << "sizeof(void*):     " << sizeof(void*)     << " bytesn";
    // Указатели на функции могут быть другого размера
    std::cout << "sizeof(void(*)()): " << sizeof(void(*)()) << " bytesn";
    return 0;
}

Типичный вывод на 64-битной Linux/macOS:

sizeof(int*):      8 bytes
sizeof(double*):   8 bytes
sizeof(void*):     8 bytes
sizeof(void(*)()): 8 bytes