Динамично выделяя и обнуляя массив плаваний

Я не уверен на 100%, что я понял ваши потребности, но обеспечение сброса пароля и тайм-аута в функции сброса может быть выполнено путем рефакторинга связанного кода с приведенным ниже. Это может быть одним из способов ...

// КАК ЕСТЬ

// Clear passkey and timeout
$this->request->data['passkey'] = null;
$this->request->data['timeout'] = null;
$user = $this->Users->patchEntity($user, $this->request->data);
if ($this->Users->save($user)) {
…

// ЭТОМУ

$user = $this->Users->patchEntity($user, $this->request->getData());

// Clear passkey and timeout
$user->passkey = null;
$user->timeout = null;

if ($this->Users->save($user)) {
…
18
задан mskfisher 11 May 2012 в 15:03
поделиться

7 ответов

Используйте sizeof (float) * filter_len , если вы не работаете в какая-то странная реализация, где sizeof (float) == sizeof (char) .

memset(delay_line, 0, sizeof(float) * filter_len);

Edit: как Stephan202 указывает в комментариях, 0.0 - это особенно простое значение с плавающей запятой для кодирования для memset, поскольку стандартное представление IEEE для 0.0 - это все нулевые биты.

memset работает в области памяти, а не в области чисел. Второй параметр, объявленный как int, приводится к беззнаковому char. Если ваша реализация C ++ использует четыре байта на число с плавающей запятой, выполняются следующие отношения:

  • Если вы запрограммируете float с 0, значение будет 0.0.
  • Если вы запомните float с 1, значение будет 2.36943e-38.
  • Если вы запомните float с 42, значение будет 1.51137e-13.
  • Если вы запомните значение с плавающей запятой с 64, значение будет 3.00392.

Так что ноль - это особый случай.

Если это кажется странным, вспомните, что memset объявлен в или , и часто используется для создания таких вещей, как «***************» или «--------------- ---». То, что он может также использоваться для обнуления памяти, является отличным побочным эффектом.

Как Милан Бабушков указывает в комментариях, есть функция bzero (нестандартная и устаревшая), доступная на данный момент на Mac и Linux, но не Microsoft, которая, поскольку она специально предназначена для обнуления памяти, безопасно пропускает несколько инструкций.

33
ответ дан 30 November 2019 в 05:43
поделиться

используйте

#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
15
ответ дан 30 November 2019 в 05:43
поделиться

Элементы динамически выделяемого массива могут быть инициализированы значением по умолчанию для типа элемента, следуя за размером массива пустой парой скобок:

float* delay_line = new float[filter_len]();
12
ответ дан 30 November 2019 в 05:43
поделиться

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

std::vector< float > delay_line( filter_len, 0.0 );
3
ответ дан 30 November 2019 в 05:43
поделиться

Используйте std :: vector вместо:

std::vector<float> delay_line( filter_len );

Вектор будет инициализирован нулем.

11
ответ дан 30 November 2019 в 05:43
поделиться

Другой вариант - использовать calloc для выделения и обнуления в в то же время:

float *delay_line = (float *)calloc(sizeof(float), filter_len);

Преимущество здесь в том, что, в зависимости от вашей реализации malloc, можно избежать обнуления массива, если известно, что он выделяется из памяти, которая уже обнулена (как это часто бывает с страницами, выделенными из операционной системы)

Помните, что для такого массива вы должны использовать free (), а не delete [].

3
ответ дан 30 November 2019 в 05:43
поделиться

Какой наиболее эффективный способ

memset может быть немного быстрее, НО КТО ЗАБОТИТСЯ!?!? Микрооптимизация до этого уровня - пустая трата времени, если только вы не программируете калькулятор, и, вероятно, даже тогда.

Я думаю, что метод memset более понятен, НО я думаю, вам действительно стоит проверить свой человек- страниц для memset ... Я был бы удивлен, если бы ваша версия стандартных библиотек имела функцию memset, которая принимает float в качестве второго аргумента.

PS: Битовый шаблон, представляющий ноль, такой же для как целые числа, так и числа с плавающей запятой ... это намеренно, а не просто удача.

Удачи; -)

Ура. Кит.

2
ответ дан 30 November 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: