2015-07-03 2 views
0

меня структура, состоящие много данных в нем:Длинный массив больших структур: предпочитаете распределение кучи или стека?

struct myStruct 
{ 
    char name[128], desc[128]; 
    struct Prm { char p_name[32]; int p_val; } parameter[512]; 
    char Reserved[256]; 
}; 

Размера всей структуры, как показано в приведенном выше примере, является 18944 байтами, предполагающими нет обивки; Мне нужно 128 из них, которые суммируются в 2424832 байт, это более 2 мегабайт.

Мне нужно объявить этот массив в глобальном масштабе, что лучший способ его выделить? Должен ли я просто сделать myStruct myData[128]; или объявить его как указатель и инициализировать с помощью new[], тогда delete[] это когда программа завершается? Или, может быть, вектор?

Будет объявлено это как простой массив беспорядка со стеком? Как я могу быть уверен, что это не проблематично?

+0

'Зарезервировано [256];'? Отсутствует тип. Примечание: вы не должны предполагать, что никакие дополнения не добавляются. Некоторые PCS используют 64-битное выравнивание для 32-битных типов данных в структурах. – Olaf

+0

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

+0

Да, действительно, это работает, я просто спрашиваю, является ли это проблемой для стека, поскольку содержание myData будет больше 2 МБ. –

ответ

3

лучший вариант из числа вашего списка std::vector<>

+0

Это зависит от обстоятельств. Просто заявляя «Это лучше», не зная, что все детали - это просто глупость. Однако это ** вариант **. – Olaf

2

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

+0

«... но в сегменте данных»: ну, только если явно инициализировано (а для некоторых компиляторов/опций только если это отличное от нуля). В противном случае они упаковываются в '.bss'. Главное отличие состоит в том, что '.data' использует пространство диска (или что-то еще), а' .bss' создается при запуске программы, – Olaf

+0

@Olaf I * знал, что кто-то укусит меня в этом: p // Я не могу найти «официальное» имя сегмента * RAM *, содержащего .bss и .data во время выполнения. – Quentin

+0

Во время выполнения они обычно упаковываются один за другим (часто с самого начала, за которым следует куча). AFAIK, фактического названия этой области нет (оперативная память не имеет сегментов для ОЗУ чтения/записи). Если вы хотите назвать его, я бы просто назвал его глобальными переменными, а не _stack_ и _heap_ или любой дополнительной областью (например, встроенными системами). Извините, я был немного придирчивым, но это было главным образом связано с дисковым пространством. Для встроенных микроконтроллеров, например. это совсем не так, если у вас есть значения инициализации во флэш-памяти или просто очистка ОЗУ при запуске. – Olaf

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