2012-02-20 2 views
2

Я использую SDL_Surface указатели, и мне интересно, если это:Делают элементы массива указателей, инициализированных NULL, занимают память?

SDL_Surface* Images[8][7]; 

, где некоторые из отдельных указателей поверхности инициализируются NULL в конструктор класса, а затем никогда не используется, будет занимать больше памяти, чем если бы те, были сохранены отдельно. Как вы можете себе представить, использование перечисления облегчит доступ к этим поверхностным указателям и не потребует операторов if или switch. Например, изображения [0] [3] на изображения [0] [7] могут быть NULL, NULL и т. Д. Заранее спасибо за ответы!

Edit: «хранятся отдельно» значение имеют имя переменной указателя и меньший массив, чтобы избежать NULL в качестве значения для некоторых изображений каковых менее 7.

Добавление: Спасибо всем за молниеносные ответы, теперь мне ясно; Я продолжу свой двумерный массив, и для других групп изображений будут другие массивы.

+1

«займет больше памяти, чем если бы они были разделены», не уверен, что имеется в виду в этом – macduff

+0

. Я добавил разъяснение к вопросу, спасибо за отзыв. – formerBGIuser

ответ

2

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

Так следующие две строки как запас пространства для 3 указателей:

SDL_Surface* surfaces[3]; 
SDL_Surface *surface1, *surface2, *surface3; 

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

+0

Мне нравится ваш ответ лучше, чемкс. – formerBGIuser

+1

Какой бы ответ вы ни выбрали, ответ на ваш вопрос вам следует отметить как принятый. См. Здесь для получения более подробной информации: http://meta.stackexchange.com/questions/5234/ –

2

Выполняют ли элементы массива указателей, инициализированных NULL, памятью?

Указатель - это тип, который занимает достаточно памяти для хранения адреса.
Итак, они будут занимать/потреблять память, как только они объявляются так же, как и любой другой тип данных, который занимает память независимо от того, инициализирована ли ее переменная или нет.

2

Массив не распределяется динамически, поэтому каждый элемент имеет память, выделенную во время компиляции. Но нулевые инициализированные указатели не указывают на дополнительную выделенную память.

Надеюсь, это то, о чем вы просите.

2

Указатели, инициализированные в NULL, используют память, но только количество байтов, необходимых для указателя.

1

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

Что касается того, следует ли использовать перечисление или что-то еще - моя основная проблема заключалась бы в том, что массивы массивов C++ массивов не идеальны. Если у вас целая строка или столбец массива пуст, я, конечно, не стал бы его определять. Просто сохраните его для чтения и обслуживания.

+0

Спасибо, все строки имеют существующий минимум минимум одного непустого члена, а некоторые из строк имеют все столбцы, являющиеся используемый. Перечисление будет ссылаться только на строки, а столбцы будут использовать только фактическое число для доступа (0,1 и т. Д.). Эта программа действительно большая (по моим меркам) и имеет 15 000 строк, поэтому я думаю, что в этом случае читаемость и ремонтопригодность должны увеличиться. – formerBGIuser

0

Указатель - это просто другой тип данных, например int, double и т. Д., Который имеет целью сохранение адресов памяти. Как правило, указатель будет принимать 32 или 64 бита в зависимости от вашей архитектуры, но может принимать больше/меньше на другое оборудование.

Так же, как int массива занимает пространство, даже если значения 0, так что тоже делает указатель массив взять пространство, даже если его значение равно 0. (NULL, как правило, просто представлена ​​как 0.)


Например, если предположить архитектуру/компилятор использует 32-битный INT:

int array[30]; 

Приведенный выше код резервирует 30 х 4 байт = 120 байт. Неважно, какие значения вы храните.


Предположим теперь, что вы на 64-битной машине:

int *ptr_array[30]; 

Приведенный выше код будет резервировать 30 х 8 байт = 240 байт, независимо от того, какие значения указателя хранить.

Вы можете представить себе это как написание 30 индивидуальных указателей:

int *ptr1, *ptr2, *ptr3, ..., *ptr30; 

Обратите внимание, что мы говорим только о размере, что указатели потребляют в памяти. Как правило, у вас будет зарезервирована память в другом месте, на которую указывают указатели (если не нуль). Разумеется, эта память будет меняться в зависимости от того, сколько вы выделили. В этом смысле, если указатели равны нулю, это означает, что им нечего указывать и может перевести на снижение потребления памяти.

+0

-1 * "Вышеприведенный код зарезервирует 30 x 4 байта = 120 байт в стеке * * Неверно, стандарт C++ не упоминает * стек * где угодно. –

+0

@Als Вы правы; Я исправил ответ. –

+0

Удалено нижнее. –

Смежные вопросы