Question

Est-ce une bonne idée pour les fonctions de l'API C d'affecter leur production, ou d'avoir l'utilisateur de spécifier la mémoire tampon de sortie? Par exemple:

BOOL GetString(
    PWSTR *String
    );
...
PWSTR string;
GetString(&string);
Free(string);

vs

BOOL GetString(
    PWSTR Buffer,
    ULONG BufferSize,
    PULONG RequiredBufferSize
    );
...
// A lot more code than in the first case

Plus précisément, je me demande pourquoi l'API Win32 utilise principalement le second cas (par exemple GetWindowText , LookupAccountSid ). Si une fonction API sait la taille de la sortie est, pourquoi l'utilisateur a essayer de deviner la taille de sortie? Je ne peux pas trouver aucune information sur pourquoi utiliser le second cas.

En outre: l'exemple LookupAccountSid est particulièrement mauvaise. En interne, il utilise l'API LSA, qui attribue la sortie pour l'appelant. Ensuite, l'utilisateur obtient LookupAccountSid d'allouer un tampon (et deviner la taille de la mémoire tampon correcte) quand il pourrait juste retourner la sortie de LSA! Pourquoi?

Était-ce utile?

La solution

L'API Win32 ne préallouer pas des tampons parce qu'il veut donner le code appelant le choix de la façon de fournir le tampon. Il permet pour eux de fournir la pile et une variété de tampons à base de tas. Il y a plusieurs endroits où la taille maximale du tampon est en avance connu du temps et les développeurs veulent la simplicité d'utilisation d'un tampon à base de pile.

Le système de fichiers est le meilleur exemple que les chemins ne dépasseront pas MAX_PATH. Ainsi, plutôt que + allouer gratuitement. Le promoteur déclare simplement un tampon à base de pile.

L'avantage d'avoir l'API C allouer de la mémoire est qu'elle simplifie la configuration d'appel. L'inconvénient du modèle Win32 est que la plupart du temps vous finissez par appeler l'API deux fois. La première fois pour déterminer la taille de la mémoire tampon, puis une deuxième fois avec un tampon de taille appropriée. Avec une mémoire tampon allouée API un seul appel est nécessaire.

L'inconvénient est que si vous ôtez le choix de l'allocation de l'appelant. De plus, vous devez communiquer votre choix afin de les libérer correctement à l'API (Windows par exemple, peuvent affecter de plusieurs endroits différents).

Autres conseils

La seconde approche présente certains avantages comme

  • Il permet aux appelants de gérer la durée de vie des allocations de mémoire
  • Il permet aux appelants de réutiliser la mémoire allouée aux différents appels qui suivent ce même modèle
  • Il permet aux appelants de décider quels un tampon pour fournir par exemple, empiler ou de tas.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top