Где хранятся метаданные указателя? - PullRequest
8 голосов
/ 03 февраля 2010

Может быть, я упускаю из виду нечто очевидное, но где хранятся метаданные указателя?Например, если у меня есть 32-битный int-указатель ptr, и я выполняю ptr++, он знает, что для продвижения 4 байтов в памятиТем не менее, если у меня есть 64-битный указатель int, он знает, что для продвижения 8 байтов.Так кто же отслеживает тип указателя ptr и где он хранится?Для простоты вы можете ограничить это C ++.

Ответы [ 3 ]

18 голосов
/ 03 февраля 2010

Это нигде не хранится, как таковое.Компилятор просматривает тип ptr и превращает операцию ++ в приращение правильного числа байтов.

7 голосов
/ 03 февраля 2010

В таблице символов во время работы компилятора.Нигде, пока ваша программа не работает, или, скорее, она неявно присутствует в коде более низкого уровня, создаваемом компилятором.

2 голосов
/ 03 февраля 2010

Он нигде не сохраняется, он определяется во время компиляции. Фактически, возьмите этот код в качестве примера:

int *abc = NULL;
cout << abc + 1; /* Prints sizeof(int) */
cout << (void *)((char *)abc + 1); /* Prints 1. Casting it back to void * is necessary,
           otherwise it will try to dereference it and print as a string. */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...