2013-07-27 3 views
1

Я инициализировал массив (unsigned short int) размером 100000000 в C 4.3.2 и другие два массива int размером 1000000. Но при отправке в онлайн-судье он выдавал SIGSEGV.Как инициализировать массив динамически со значением по умолчанию?

Для этого я решил инициализировать мой массив динамически значением по умолчанию 0, поскольку добавление значения по циклу занимает много времени.

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

+7

100000000 действительно? – P0W

+0

с таким размером, вероятно, имеет смысл запросить память из ОС непосредственно через 'mmap()' для UNIX-подобных систем или 'VirtualAlloc()' в Windows; удобно, эти функции уже обнулили память для вас ... – Christoph

ответ

8

Вы можете использовать void *calloc(size_t nmemb, size_t size); функцию для инициализации памяти с 0,

calloc() функция выделяет память для массива nmemb элементов размером байт каждый, и возвращает указатель на выделенную память. Память установлена ​​на zero. Если nmemb или размер 0, то calloc() возвращает либо NULL или уникальное значение указателя, который впоследствии может быть успешно передан free().

calloc(number of elements, sizeof(type)); 

или вы можете также использовать memset() явно инициализировать память, выделенную malloc() вызова.

Примечание:calloc() не магия либо - это также использовать цикл где-то, чтобы заменить мусор со всеми нулями.

Смотрите также:Why malloc() + memset() is slower than calloc()?

+6

+1 Возможно, стоит упомянуть, что 'calloc()' тоже не волшебство - он также ** будет использовать цикл где-нибудь, чтобы заменить мусор все нули. –

+1

@GrijeshChauhan Вы становитесь лучше и лучше –

+2

@Coffee_lover В эти дни я безработный, поэтому я получаю время: P: D Спасибо! –

0

Вы не можете устранить время инициализации, независимо от того, что вы делаете. Лучшее, что вы можете сделать, это попытаться сделать optimize it. Приводятся 2 метода:

  • Эффективно используйте ваш HW. Для инициализации буфера используйте обращения к памяти собственного размера. Например, в 32-битном цикле архитектуры и записи в 4-байтовых фрагментах.
  • Разверните петлю, чтобы устранить накладные расходы.

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

Вы также можете попытаться перенести служебные данные инициализации в некритический раздел. Например, вы можете использовать статические переменные, которые будут инициализированы нулем при запуске программы. Или, наоборот, вы можете отложить инициализацию до первого использования (ленивая инициализация).

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