c++ - length - Asignar dinĂ¡micamente y configurar a cero una matriz de flotadores
dynamic array c++ (7)
¿Cómo configuro automáticamente una matriz asignada dinámicamente de flotadores a cero (0.0) durante la asignación?
Esta bien
float* delay_line = new float[filter_len];
//THIS
memset(delay_line, 0.0, filter_len); //can I do this for a float??
//OR THIS
for (int i = 0; i < filter_len; i++)
delay_line[i] = 0.0;
Cual es la forma mas eficiente
Gracias
Cual es la forma mas eficiente
tal vez un poco más rápido, pero ¿a quién le importa? La microoptimización a este nivel es una pérdida total de tiempo, a menos que esté programando una calculadora, y probablemente ni siquiera entonces.
Creo que la forma en que memset es más clara, PERO, creo que es mejor que compruebes tus páginas de manual para memset ... Me sorprendería que tu versión de las bibliotecas estándar tenga una función memset que tenga un carácter flotante como segundo argumento.
PD: El patrón de bits que representa cero es el mismo tanto para enteros como para flotantes ... esto es por diseño, no solo buena suerte.
Buena suerte ;-)
Aclamaciones. Keith.
Ahora que estamos en ello: incluso mejor sería utilizar la clase vector
.
std::vector< float > delay_line( filter_len, 0.0 );
Los elementos de una matriz asignada dinámicamente se pueden inicializar al valor predeterminado del tipo de elemento siguiendo el tamaño de la matriz por un par de paréntesis vacíos:
float* delay_line = new float[filter_len]();
Otra opción es usar calloc para asignar y poner a cero al mismo tiempo:
float *delay_line = (float *)calloc(sizeof(float), filter_len);
La ventaja aquí es que, dependiendo de su implementación de malloc, es posible evitar la puesta a cero de la matriz si se sabe que se asigna desde la memoria que ya está puesta a cero (como lo son las páginas asignadas desde el sistema operativo)
Tenga en cuenta que debe usar free () en lugar de eliminar [] en dicha matriz.
Use sizeof(float) * filter_len
menos que esté trabajando en alguna implementación extraña donde sizeof(float) == sizeof(char)
.
memset(delay_line, 0, sizeof(float) * filter_len);
Edición: Como señala Stephan202 en los comentarios, 0.0 es un valor de punto flotante particularmente fácil de codificar para memset, ya que la representación estándar de IEEE para 0.0 es de cero bits.
memset está operando en el ámbito de la memoria, no en el reino de los números. El segundo parámetro, declarado int, se convierte en un carácter sin signo. Si su implementación de C ++ usa cuatro bytes por flotador, las siguientes relaciones se mantienen:
- Si metset el flotador con 0, el valor será 0.0.
- Si metset el flotador con 1, el valor será 2.36943e-38.
- Si realiza el flotador con 42, el valor será 1.51137e-13.
- Si metset el flotador con 64, el valor será 3.00392.
Entonces el cero es un caso especial.
Si esto parece peculiar, recuerde que memset está declarado en <cstring> o <string.h>, y se usa a menudo para hacer cosas como "***************" o "- ---------------- ". Que también se pueda utilizar para poner a cero la memoria es un efecto secundario ingenioso.
Como señala Milan Babuškov en los comentarios, hay una función bzero (no estándar y obsoleta), disponible por el momento en Mac y Linux pero no en Microsoft, que, debido a que está especialmente diseñada para configurar la memoria a cero, omite algunas instrucciones de forma segura. . Si lo usa, y una versión futura puritana de su compilador lo omite, es trivial implementar bzero usted mismo en un parche de compatibilidad local, a menos que la versión futura haya reutilizado el nombre para algún otro propósito.
Use un std :: vector en su lugar:
std::vector<float> delay_line( filter_len );
El vector será cero inicializado.
utilizar
#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )