Размеры переменных указателя - PullRequest
1 голос
/ 01 апреля 2011

Будет ли массив постоянного размера int x[20] меньше динамического массива int * x = new int[20], поскольку динамический массив является указателем, который занимает место?Или массив постоянного размера тоже является указателем?Почему или почему нет?

Еще один вопрос: что-то, в чем я никогда не был уверен на 100%, это то, что на 32-битной машине указатели имеют длину 32 бита?И обрабатываются ли указатели так же, как обычные переменные, когда дело доходит до места в ОЗУ, в котором они хранятся?

Справка будет очень признательна.

Ответы [ 5 ]

1 голос
/ 01 апреля 2011

Динамический будет использовать больше памяти;насколько больше зависит от размера указателей и размера метаданных распределителя памяти.

На любой современной машине, как говорит @Jonathan, 32-разрядные машины используют 32-разрядные указатели, и между ними нет существенной разницы (кроме стека и кучи) в том, как обрабатываются указатели в сравнении с данными.Старые машины (или даже более новые, если вы создаете «реальный режим» с разделенными инструкциями и пространствами данных) будут различать функции и указатели данных, но не в том месте, где они сами находятся, и в каком адресном пространстве они указывают.

Некоторые очень старые машины и некоторые экспериментальные архитектуры - ни с одной из которых вы никогда не столкнетесь - на самом деле управляют указателями, а иногда и данными;Историческая обработка Emacs целых чисел (кража одного или нескольких битов для внутреннего использования) отражает использование «битов тегов» на некоторых старых архитектурах.Вы также можете иногда сталкиваться (в основном со старыми) программами, которые «знают», что указатели должны быть выровнены по 4-байтовым границам, и заимствуют 2 младших бита указателей для других целей (состояние сборки мусора было обычным явлением).

1 голос
/ 01 апреля 2011

Будет ли массив постоянного размера int x [20] меньше динамического массива int * x = new int [20], поскольку динамический массив является указателем, который занимает пространство?

Должны быть сохранены адреса памяти обоих типов, будь то смещение первого элемента в массиве постоянного размера или указатель на динамический массив. Сами массивы имеют одинаковый размер, и (я полагаю) другие данные также.

Переменная массива постоянного размера, x, может использоваться в некотором смысле подобно указателю, но сама по себе не является указателем, это массив.

32-разрядные и 64-разрядные обычно относятся к адресации памяти, поэтому указатели являются 32-разрядными в 32-разрядной системе и 64-разрядными в 64.

Указатели очень похожи на целые числа и хранятся в памяти одинаково (вы можете преобразовать указатель на 32-битной машине в слово, и оно не потеряет информацию). Они просто ссылаются на смещение в памяти где-то еще, где хранятся фактические данные.

1 голос
/ 01 апреля 2011

Динамический массив не является указателем - но вам нужен как указатель, так и массив, поэтому выделенная версия использует больше места. Преимущество выделенной версии заключается в том, что вы можете выделять правильное количество места вместо того, чтобы выделять больше места, чем обычно используете (например, вы можете выделить ровно 37 целых чисел, а не выделять 100 на случай, если размер большой 100).

Да, 32-разрядные машины имеют 32-разрядные указатели, по сути, без исключения.

Да, указатели обрабатываются так же, как и другие переменные, если они находятся в ОЗУ.

0 голосов
/ 01 апреля 2011

Это зависит от того, какой размер вы хотите узнать.

Размер переменной x, безусловно, будет меньше в случае int* x = new int[20]. В этом случае x является просто указателем и, следовательно, имеет размер указателя (обычно 4 байта в 32-битной системе и 8 байтов в 64-битной системе). В другом случае x на самом деле является статически распределенным массивом длины 20, поэтому его размер будет sizeof(int) * 20.

Если вы говорите о размере фактического массива, хотя на самом деле нет никакой разницы. Вопрос в том, где он будет выделен. В int x[20] он обычно находится в стеке, а версия указателя - в куче

0 голосов
/ 01 апреля 2011

Насколько я понимаю, имя массива постоянного размера - это указатель на первый элемент массива (по существу)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...