Какой размер указателя в 64-битном режиме?

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

Ответ

В 64-битном режиме (архитектура x86-64, также известная как AMD64) размер любого указателя — 8 байт (64 бита). Это фундаментальное отличие от 32-битного режима, где указатель занимает 4 байта.

Проверка и последствия:

#include <iostream>
#include <cstdint>

int main() {
    std::cout << "sizeof(int*): " << sizeof(int*) << " bytesn";
    std::cout << "sizeof(void*): " << sizeof(void*) << " bytesn";
    std::cout << "sizeof(std::string*): " << sizeof(std::string*) << " bytesn";
    // Все выводы будут равны 8 на 64-битной системе.

    // Практическое следствие: структуры с множеством указателей становятся "тяжелее".
    struct Node32 { Node32* next; int data; }; // Размер ~8 байт в 32-битном
    struct Node64 { Node64* next; int data; }; // Размер ~16 байт в 64-битном (из-за выравнивания)
    std::cout << "Size of Node64: " << sizeof(Node64) << " bytesn";
    return 0;
}

Ключевые технические детали:

  1. Адресное пространство: 64-битный указатель теоретически может адресовать 16 эксабайт (2^64). Однако, современные процессоры x86-64 используют только 48 бит (256 ТБ) для виртуальных адресов, что более чем достаточно для любых практических задач.
  2. Влияние на производительность: Увеличение размера указателей может привести к большему потреблению памяти (особенно в структурах данных вроде связных списков или графов) и более частым промахам кэша. В высокопроизводительном коде иногда используют 32-битные индексы или относительные указатели внутри ограниченных пулов памяти, чтобы смягчить этот эффект.