Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Сколько места в памяти занимает указатель в C++?

Искал информацию по данному вопросу, но не находил однозначного ответа. Кто-то говорит, что все зависит от разрядности операционной системы: если система x64, то выделяется 8 байт, если же x86, то 4. Другие утверждают, что указатель занимает столько же памяти, сколько и та переменная, на которую указывает указатель. То есть если у меня есть строковая переменная типа string, которая занимает 28 байт, то, если я создам указатель на эту переменную, то и он займет 28 байт? Или же 4(8)? Где представлена верная информация?


Ответ

Размер указателя зависит от настроек компилятора в момент компиляции программы. Больше ни от чего. Как вы скажете компилятору - так и будет. Никакого отношения к OS или hardware, на которых производится компиляция программы, размер указателя не имеет. Настройки компилятора определяют все параметры целевой платформы, для которой будет выполнена компиляция, в том числе и размер указателя.
В современных "массовых" целевых платформах используется так называемая плоская модель памяти с указателями размера 32 или 64 бита (4 или 8 байтов). Во времена DOS/Win16, когда подлежащая аппаратура использовала сегментную адресацию памяти, компиляторы С++ поддерживали целый зоопарк разнообразных моделей памяти (tiny, small, large, compact, standard, huge и т.д.) в каждой из которых мог быть свой размер указателя. Если компиляция производится для какой-то более экзотической целевой платформы (embedded etc.), то и размер указателя может быть совсем другим.

В языке С++ также есть свои особые типы "указателей", такие как указатели-на-члены-класса. Эти типы обычно обладают своей особой внутренней структурой и их размер обычно превосходит размер обычного указателя.

Комментариев нет:

Отправить комментарий