Как правильно инициализировать очень большую структуру?
В нашем коде у нас было что-то вроде этого:
*(controller->bigstruct) = ( struct bigstruct ){ 0 };
Раньше это прекрасно работало, а затем мы обновили версии GCC и неожиданно начали видеть переполнение стека. Глядя на сборку, старый код GCC (2.x) в основном делал это:
memset(controller->bigstruct, 0, sizeof(struct bigstruct));
Новый GCC (3.4.x) делал это
struct bigstruct temp = { 0 };
controller->bigstruct = temp;
Изучив спецификацию C99, я понял, почему; C99 в основном требует наличия анонимных структур в стеке. Это'Хорошая концепция, но эта структура была размером в 4 мегабайта и предназначена только для кучи!
Мы'мы стали делать свои собственныеинициализировать» функция, которая явно устанавливает членов, но этоуродливая и головная боль обслуживания. Я нене считаю memset правильным решением, потому что я не могуне знаю, что значение бита, равное 0, является подходящим нулевым значением для типа (выбор нит, я знаю, но вот вы; я нене возражаю, что компилятор делает это, потому что этоМожно знать)
Что "правильный"или, по крайней мере, лучший способ инициализации такой большой структуры?
Чтобы уточнить, почему я думаю, что memset неРешение: правила инициализации элементов, которые не были явно инициализированы, такие же, как статическая инициализация, и заключаются в следующем: - если он имеет тип указателя, он инициализируется нулевым указателем; - если он имеет арифметический тип, он инициализируется нулем (положительным или без знака); ...»
MemSet» установит память в ноль бит-шаблона, который неТ обязательно то же самое. Представьте себе систему, которая неt использовать числа с плавающей точкой IEEE. Необычно, но поддерживается C. Представление 0.0 недолжен иметь в виду "все биты ноль "Это может быть что угодно для процессора.