2008-09-20 11 views
14

¿Por qué no tiene el nivel C una función memswap, lo que probablemente el siguiente aspecto:Por qué no hay una función estándar memswap

int memswap(void *ptr1, void *ptr2, size_t nbytes)? 

Sé que sería fácil de escribir, pero creo la libc podría hacer algunos trucos increíbles para acelerarlo, como algunas implementaciones lo hacen para memcpy.

Respuesta

6

Esto no es algo que se requiera rutinariamente.

Las ideas pueden haber sido consideradas y descartadas porque es bastante difícil encontrar un algoritmo que sea de propósito general. No olvide que C es un lenguaje antiguo y las extensiones deben ser útiles en general.

posibles condiciones de error: -

  • comportamiento cuando los rangos que se intercambian solapamiento
  • longitud de cero
  • funcionamiento de la memoria (una implementación óptima podría asignar memoria para hacer esto)
  • nula puntero

El mejor algoritmo m también podría depender de lo que esté haciendo, de modo que podría estar mejor codificado directamente por usted.

  • intercambio de estructuras susceptibles de ser más rápido utilizando una estructura temp y asignación
  • pequeñas longitudes - puede ser mejor asignación de memoria temporal
  • longitudes largas - 'sección' por la sección de intercambio (donde sección es alguna longitud óptima)
  • uso de las funciones de copia de hardware
+3

El mejor algoritmo no es necesariamente el suyo.GCC tiene 'memset' como palabra clave, y en función de lo que usted está configurando, puede salir de la llamada de función, o tener un bucle for, o tener un bucle desenrollado, etc. los compiladores son inteligentes en estos días. – Claudiu

+0

Bueno, los resultados naturales de esos son: superposición -> UB, longitud == 0 -> no-op, debe estar en su lugar, posiblemente usando una cantidad fija de pila, null-pointer -> UB. Nada de ninguna manera sorprendente allí. – Deduplicator

+0

Acepto que el mejor algoritmo puede depender de lo que esté haciendo, pero también podría escribir esta función 'memswap' sin un búfer dinámico, copiando char-by-char (sizeof (char) = 1byte) – Zorgatone

2

Probablemente porque no se necesita con mucha frecuencia. Me limito a menear y memcpy con bastante frecuencia, pero no sé si alguna vez habría usado memswap si estuviera disponible.

10

Creo que porque no se necesita con mucha frecuencia. Sin embargo, hay una manera fácil de hacer esto en C++:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + nbytes, ptr2) 

Es tal vez no sea tan optimizada como un compilador integrado, pero tiene el potencial de ser más rápido que un bucle se escribe por sí mismo, ya que puede tener una optimización específica de la plataforma que no implementaría.

Debe tener cuidado con lo anterior, ya que supone que ptr1 y ptr2 son punteros de char. La forma más canónica de hacer esto es:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + num_items, ptr2) 
2

Es probable que no se requiere muy a menudo en la programación en C, C++, donde swap es una cosa normal que hacer en miembros de la clase no es el algoritmo std::swap que está muy optimizado para diferentes tipos.

-2

has mirado hisopo?

hisopo de hombre

+2

Sí, pero esa función hace algo más. Copia el contenido de la primera matriz al segundo y cambia el orden de bytes al mismo tiempo. – quinmars

Cuestiones relacionadas