Funciones de plantilla de envoltura para MEMSET () -- ++ campo con c++11 campo con c++14 camp codereview Relacionados El problema

Wrapper template functions for memset()


5
vote

problema

Español

Tengo estas tres funciones de ayuda que he usado en algunos proyectos como una alternativa ligeramente mejor a la función C (5+16(8-4))/164 . El objetivo es simplificar y aclarar el código, así como agregar (5+16(8-4))/165 s donde sea posible:

  (5+16(8-4))/166  

Ejemplo de uso:

  (5+16(8-4))/167  

Me gustaría mejorar aún más las funciones con características C ++ 11/14. Creo que sería una buena idea (5+16(8-4))/168 con (5+16(8-4))/169 para asegurarse de que nunca se llaman a una instancia de clase. ¿Estás de acuerdo?

también, ¿debo hacerlos #0 ?

¿Alguna otra recomendación?

Original en ingles

I have these three helper functions that I've used on some projects as a slightly better alternative to the C memset function. The objective is to simplify and clarify code, as well as add asserts where possible:

// Zero fills a POD type, such as a structure or union. template<class T> void ZeroStruct(T & s) {     std::memset(&s, 0, sizeof(T)); }  // Zero fills a statically allocated array of POD or built-in types. Array length inferred by the compiler. template<class T, size_t N> void ZeroArray(T (&arr)[N]) {     std::memset(arr, 0, sizeof(T) * N); }  // Zero fills an array of POD or built-in types, with array length provided by the caller. template<class T> void ZeroArray(T * arr, size_t arrayLength) {     assert(arr != nullptr);     assert(arrayLength != 0);     std::memset(arr, 0, sizeof(T) * arrayLength); } 

Usage example:

int arr[128]; ZeroArray(arr);  struct S {     int   x;     float y; }; S s; ZeroStruct(s); 

I'd like to further improve those functions with C++11/14 features. I think it would be a good idea to static_assert with std::is_pod to ensure they are never called on a class instance. Do you agree?

Also, should I make them noexept?

Any other recommendations?

        

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Creo que sería una buena idea static_assert con std::is_pod para asegurarse de que nunca se llaman a una instancia de clase. ¿Estás de acuerdo?

Hacer que su codificación sea más fácil y evitando errores con Memset es la única razón por la que puedo ver para sus ayudantes. En realidad, está creando algo como una versión mejorada de 9988777665544332 ( que estaba desaprobado, pero eso es una historia diferente). Una respuesta aquí .

Más de una vez, he encontrado un error que parecía:

  memset(someobject, size_of_object, 0);    // clear object   

El compilador no se quejará ...

Todavía hay muy pocos casos cuando necesita cero la memoria de una estructura o una matriz:

  1. Cuando eres Reutilizando la estructura / matriz (¿Pero qué función de la biblioteca realmente necesita eso?)
  2. para seguridad razones (no dejar contraseñas en la memoria).

Otros casos están cubiertos por la inicialización ( = {0} o = the_struct() ).

Finalmente, ¿por qué PascalCasing en el nombre? bzero o zero_fill sería mejor para C ++ (ya que Pascalcasing es para tipos, a menos que esté en Microsoft World).

también, ¿debo hacerlos noexcepto?

Suena como una buena idea (para las primeras dos versiones, cuando el tamaño se determina a partir del tipo, no proporcionado explícitamente ). La tercera versión es problemática y un poco poco clara, lo eliminaría por completo y usaría memset9 / 99887766555443310 En tales casos para hacer que su código sea más obvio (legible y comprensible), porque ya tiene que tener cuidado de proporcionar un tamaño adecuado de matriz: debe pensar dos veces aquí y en lugar de escribir un poco más en lugar de usar ayudantes poco claros (solo consejos personales).

 

I think it would be a good idea to static_assert with std::is_pod to ensure they are never called on a class instance. Do you agree?

Making your coding easier and preventing errors with memset is the only reason I can see for your helpers. You are actually creating something like improved version of bzero (which was deprecated, but that is different story). One answer here.

More than once I've come across a bug that looked like:

memset(someobject, size_of_object, 0);    // clear object 

The compiler won't complain ...

There are still very few cases when you need to zero the memory of a struct or an array:

  1. When you are reusing the struct/array (but which library function really needs that?)
  2. For security reasons (not to leave passwords in memory).

Other cases are covered by initialization (= {0} or = the_struct()).

Finally, why PascalCasing on the name? bzero or zero_fill would be better for C++ (as PascalCasing is for types, unless you are in Microsoft world).

Also, should I make them noexcept?

Sounds like a good idea (for first two versions, when the size is determined from the type, not provided explicitly). The third version is problematic and a bit unclear, I would completely remove it and use memset/std::fill in such cases to make your code more obvious (readable and understandable), because you already have to take care to provide proper array size - you should think twice here and rather type a bit more instead of using unclear helpers (just personal advice).

 
 
3
 
vote

No hagas eso es tan fácil tener un uso incorrecto.

Todos sus casos se pueden hacer usando la sintaxis normal en C ++.

  std::is_pod1  

ver:
Constructor de copia implícito de C ++ para una clase que contiene otros objetos
forma correcta de inicializar las estructuras C ++
¿Una estructura C ++ tiene un constructor predeterminado?

 

Don't do that it is so easy to have incorrect usage.

All your cases can be done using normal syntax in C++.

// int arr[128]; // ZeroArray(arr);  int arr[128] = {0}; // Zero whole array. // Or better yet use a vector. std:vector<int>  arr(128); // zero init the vector of 128 elements. // Or alternatively an array std::array<int,128> arr(0);  // S s; // ZeroStruct(s); S s = S();          // Calls the default constructor for zero initialization. 

See:
C++ implicit copy constructor for a class that contains other objects
Proper way to initialize C++ structs
Does a c++ struct have a default constructor?

 
 
       
       

Relacionados problema

8  Implementación de un algoritmo * en C ++  ( Implementation of a algorithm in c ) 
He implementado el algoritmo de búsqueda de la ruta A-STAR para una cuadrícula 2D. La función devuelve una lista de posiciones de una ruta aceptable. main.c...

5  Meta Funciones para secuencias de exponentes de 2  ( Meta functions for sequences of exponents of 2 ) 
He implementado algunas funciones META para crear secuencia para los exponentes de 2. Me encantaría saber si hay alguna forma de hacer que el código sea más o...

2  Set persistente (árbol negro rojo)  ( Persistent set red black tree ) 
Esta es una estructura de datos parcialmente persistente utilizando un árbol negro rojo. Se copiarán $ O (LG (N)) $ artículos para cada operación eliminar o...

1  Minimax de gama de iteradores de entrada  ( Minimax of input iterator range ) 
Publiqué anteriormente una Pregunta al encontrar el valor máximo de una dispatch_sync(dispatch_get_main_queue(), ^{5 Rango. Por completo, pensé que serí...

5  Clase genérica de múltiples dimensiones / matriz en C ++  ( Generic multi dimension grid array class in c ) 
Estoy escribiendo una matriz multidimensional genérica de C ++ 14 para el propósito de la ciencia computacional. Las "características" hasta ahora para la c...

4  (C ++ 14) Estado de manejo en la función C-Style Pointer Callbacks  ( C14 handling state in c style function pointer callbacks ) 
Tengo algunos problemas que se presentan con una solución sensible para usar el estado compartido en un puntero de función de estilo C. Estoy usando GLFW para...

5  Implementación TIC-TAC-TOE en C ++  ( Tic tac toe implementation in c ) 
Primer programa completo en C ++. Estoy teniendo problemas para entender cuando debería usar clases y cuando no debería. En última instancia, después de esta ...

7  Obtener extensión (s) de camino  ( Get extensions from path ) 
Estoy escribiendo una función de utilidad que devuelve la (s) extensión (s) de un boost::filesystem::path (V3). La clase de camino de Boost ya tiene parte d...

12  Aplique una función a cada elemento de una tupla ("Mapa" una tupla)  ( Apply a function to each element of a tuple map a tuple ) 
c ++ no (todavía) tiene una 'MAP' función de orden superior < / a>, ciertamente no uno que se aplica a una secuencia de valores de compilación como una tupla...

5  Tabla de conversión de temperatura en C ++ 14  ( Temperature conversion table in c14 ) 
Estoy aprendiendo C ++ y pensé que intentaría escribir mi mano al escribir un programa básico en C ++ moderno. Siempre estoy buscando formas de reducir mi cód...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos