2008-09-20 6 views
14

Pourquoi n'a pas la norme c une fonction memswap, qui probablement ressembler à:Pourquoi est pas là une fonction standard de memswap

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

Je sais que ce serait facile d'écrire, mais je pense la libc pourrait faire quelques trucs géniaux pour l'accélérer comme certaines implémentations le font pour memcpy.

Répondre

6

Ce n'est pas quelque chose qui est habituellement requis.

Les idées peuvent avoir été considérées et rejetées parce qu'il est assez difficile de trouver un algorithme qui soit général. N'oubliez pas que C est une langue ancienne et que les extensions doivent être généralement utiles.

conditions d'erreur possibles: -

  • comportement lorsque les plages étant permutées chevauchement
  • longueur de zéro
  • manquer de mémoire (une mise en oeuvre optimale peut allouer de la mémoire pour ce faire)
  • null pointeur

Le meilleur algorithme m pourrait également dépendre de ce que vous faites, et ainsi pourrait être mieux codé directement par vous.

  • structures échange susceptibles d'utiliser plus rapidement une structure temporaire et l'affectation
  • petites longueurs - peut être mieux allouer de la mémoire temporaire
  • longues longueurs - « section » par l'article swap (où la section est une longueur optimale)
  • utilisation de matériel fonctions de copie
+3

Le meilleur algorithme n'est pas nécessairement le votre.GCC a 'memset' comme mot-clé, et en fonction de ce que vous faites, il peut laisser l'appel de fonction, ou avoir une boucle for, ou avoir une boucle forflée, etc. Les compilateurs sont intelligents ces jours-ci. – Claudiu

+0

Eh bien, les résultats naturels de ceux-ci sont: chevauchement -> UB, longueur == 0 -> no-op, devrait être en place, en utilisant éventuellement une quantité fixe de pile, null-pointeur -> UB. Rien de surprenant là-bas. – Deduplicator

+0

Je suis d'accord que le meilleur algorithme peut dépendre de ce que vous faites, mais vous pouvez aussi écrire cette fonction 'memswap' sans tampon dynamique, en copiant char-by-char (sizeof (char) = 1byte) – Zorgatone

2

Probablement parce que ce n'est pas nécessaire très souvent - je memset et memcpy raisonnablement souvent, mais je ne sais pas que j'aurais jamais utilisé memswap si elle était disponible.

10

Je pense que ce n'est pas souvent nécessaire. Cependant, il existe un moyen facile de le faire en C++:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + nbytes, ptr2) 

Il est qu'il ne peut pas être aussi optimisé en tant que compilateur intégré, mais il a le potentiel d'être plus rapide qu'une boucle que vous écrivez pour vous-même, car il peut avoir une optimisation spécifique à la plateforme que vous n'implémenteriez pas.

Vous devez faire attention avec ce qui précède, car il suppose que ptr1 et ptr2 sont des pointeurs char. La façon la plus canonique de le faire est:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + num_items, ptr2) 
2

Il est probablement pas nécessaire très souvent dans la programmation C, en C++ où swap est une chose régulière à faire sur les membres de la classe, il y a l'algorithme std::swap qui est hautement optimisé pour différents types.

-2

avez-vous regardé coton-tige?

man swab

+2

Oui, mais cette fonction fait autre chose. Il copie le contenu du premier tableau dans le second et échange l'ordre des octets en même temps. – quinmars

Questions connexes