Имена указателей C ++ - PullRequest
5 голосов
/ 16 мая 2009

Я понимаю, что указатели используются, чтобы указывать на объекты, так что вы должны иметь то же самое в программе. Но были и как хранятся имена указателей. Было бы излишним объявить имя указателя, которое занимает больше ресурсов, чем объект, на который он указывает, например:

int intOne = 0;
int *this_pointer_is_pointing_towards_intOne = &intOne;

Я знаю, что это нелепый пример, но я просто пытался донести идею.

Редактировать: имя указателя должно храниться где-то, занимая больше байтов, чем адрес указанного объекта.

Ответы [ 8 ]

22 голосов
/ 16 мая 2009

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

14 голосов
/ 16 мая 2009

Имя локальных переменных требуется только для компилятора, чтобы найти переменные, на которые вы хотите сослаться. После компиляции эти имена обычно стираются и полностью заменяются числовыми символами или эквивалентами. Это происходит для всех имен, которые практически не связаны (конечно, если вы делаете отладочную сборку, все может быть по-другому). То же самое относится и к параметрам функции.

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

И, в конце концов, они не занимают оперативную память. Эти имена хранятся в таблице перераспределения с целью связывания (см. Программу strip, как удалить эти имена).

Но в любом случае, мы говорим о нескольких байтах, которые уже потрачены на выравнивание и так далее. Сравните это с адскими именами шаблонов. Попробуйте это:

readelf -sW /usr/lib/libboost_*-mt.so  | awk '{ print length($0), $0 }' | sort -n
9 голосов
/ 16 мая 2009

Имена указателей не сохраняются. Имя указателя (или любое имя переменной в этом отношении) не компилируется в окончательный двоичный файл (при условии, что вы не компилируете с установленными символами on).

Указатели - это просто целые числа (или длинные), хранящиеся в памяти, которые, в свою очередь, указывают на элемент, на который они указывают, в каком-то месте в памяти.

4 голосов
/ 16 мая 2009

Microsoft использует префикс "p" для указания указателя:

int intOne = 0;
int* pIntOne = &intOne;

Они фактически используют Венгерский на всем.

Это работает довольно хорошо, когда вы привыкнете видеть это. Многие думают, что это поначалу некрасиво.

Что бы вы ни решили, я думаю, что стоит отметить, что что-то является типом указателя в названии, хотя я бы не стал так далеко, как ваш пример. :)

2 голосов
/ 16 мая 2009

Я согласен с предыдущими постами, но я бы хотел кое-что указать на это. Иногда люди злоупотребляют указателями, думая, что их использование автоматически обеспечит небольшие следы памяти. Это не всегда так. Рассмотрим этот кусок кода:

void myfunc(const char *var) {
    // Function body
}

Указатель на char займет 32 байта в 32-битной архитектуре, в то время как сам char обычно занимает 1 байт. (Здесь предполагается, что var указывает на один байт, а не на строку.) Вы видите точку? С другой стороны, вы всегда должны использовать указатели (или ссылки) для сложных объектов:

void myfunc(const string &str) {
    // Function body
}

Конечно, если вы хотите изменить переменную внутри вашей функции, вы должны удалить ключевое слово const.

1 голос
/ 01 июня 2009

Я не вижу причины, почему этому вообще должно предшествовать что-либо. Ваш компилятор / редактор сделает всю работу за вас.

0 голосов
/ 01 июня 2009

Здесь есть две критические точки, которые я хотел бы попытаться отогнать:

  1. Длина имени переменной не влияет на пространство, выделенное для данных в окончательной скомпилированной программе C / C ++, так как компилятор предлагает свои собственные имена для переменных.
    • N.B. Некоторые компиляторы, особенно старые, могут распознавать только первые несколько букв имени переменной, поэтому слишком длинные и слишком сложные имена переменных в исходном коде могут привести к конфликтам
    • Кроме того, если вы создадите файлы символов для отладки, они будут содержать все имена ваших переменных, поэтому они станут чрезмерно большими, но это может существенно не замедлить отладку, я никогда не проверял!
  2. Пространство, необходимое для хранения указателя, действительно может быть больше, чем пространство, необходимое для указанных данных, но все же есть обстоятельства, при которых вы можете использовать их в любом случае. Например, в архитектуре, такой как COM, где практика заключается в том, что функции возвращают только код результата (успех или неудача), а все изменяемые данные выполняются с помощью указателей, передаваемых в стеке:
    /*
        pszString could be pointing to only one character which
        is less space than the pointer
    */
    HRESULT OneLetterSplat(char * pszString)
    {
        *pszString = 'a';
        return SUCCESS
    }
    
0 голосов
/ 16 мая 2009

Скважинные указатели чаще всего используются для вещей, которые выделяются динамически, и / или функций.

В случае динамического выделения вы можете просто предшествовать ему с ptr, если вы настаиваете на использовании этой записи. В случае функций веселье работает так же хорошо.

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