Используйте sizeof(float) * filter_len
, если вы не работаете в какой-то странной реализации, где sizeof(float) == sizeof(char)
.
memset(delay_line, 0, sizeof(float) * filter_len);
Редактировать: Как Stephan202 указывает в комментариях, 0.0 - это особенно легкое значение с плавающей запятой для кодирования memset, поскольку стандартное представление IEEE для 0.0 - это все нулевые биты.
memset работает в области памяти, а не в области чисел. Второй параметр, объявленный как int, приводится к неподписанному символу. Если ваша реализация C ++ использует четыре байта на число с плавающей запятой, выполняются следующие отношения:
- Если вы установите значение 0 с плавающей точкой, значение будет равно 0,0.
- Если вы установите значение float с 1, значение будет 2.36943e-38.
- Если вы установили значение float с 42, значение будет 1.51137e-13.
- Если вы установили значение float с 64, значение будет 3.00392.
Так что ноль - это особый случай.
Если это кажется странным, вспомните, что memset объявлен в или и часто используется для создания таких вещей, как «***************» или "------------------". То, что он может также использоваться для обнуления памяти, - отличный побочный эффект.
Как отмечает Милан Бабушков в комментариях, есть функция bzero (нестандартная и не рекомендуемая), доступная на данный момент для Mac и Linux, но не для Microsoft, которая, поскольку она специально предназначена для установки нуля в памяти, безопасно исключается несколько инструкций. Если вы используете его, а в пуританском будущем выпуске вашего компилятора он пропущен, тривиально внедрить bzero в локальный патч совместимости тривиально, если в будущем выпуске повторно не используется имя для каких-либо других целей.