89 votes

Pourquoi dois-je me std::get_temporary_buffer ?

Pour quelle raison je devrais utiliser std::get_temporary_buffer? La norme indique les éléments suivants:

Obtient un pointeur de stockage suffisante pour stocker jusqu'à n adjacentes T des objets.

Je pensais que le tampon est alloué sur la pile, mais ce n'est pas vrai. Selon la Norme C++ ce tampon est pas temporaire. Quels sont les avantages de cette fonction sur la fonction globale ::operator new, ce qui n'est pas de construire les objets. Suis-je en droit que les énoncés suivants sont équivalents?

int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );

Cette fonction n'existe pas pour la syntaxe de sucre? Pourquoi est-il temporary dans son nom?


Un cas d'utilisation a été suggéré dans le Dr Dobb's Journal, juillet 01, 1996 pour la mise en œuvre des algorithmes:

Si pas de tampon peut être alloué, ou si elle est plus petite que ce qui est demandé, l'algorithme fonctionne toujours pas correctement, Il se contente de les ralentit.

48voto

Georg Fritzsche Points 59185

Stroustrup dit dans "Le Langage de Programmation C++" (§19.4.4, SE):

L'idée est qu'un système peut conserver un numéro de fixe-tampons de taille de prêt pour l'allocation rapide de sorte que demandent de l'espace pour n objets peuvent céder la place à plus de n. Il peut aussi donner moins, cependant, d'une façon d'utiliser get_temporary_buffer() est optimiste demander beaucoup et ensuite utiliser ce qui arrive à être disponibles.
[...] Parce qu' get_temporary_buffer() de bas niveau et susceptibles d'être optimisé pour la gestion des tampons temporaires, il ne devrait pas être utilisé comme une alternative à la nouvelle ou de l'allocateur::allouer() pour l'obtention d'un stockage à long terme.

Il commence aussi l'introduction de deux fonctions:

Les algorithmes souvent besoin temporaire d'espace pour effectuer de façon acceptable.

... mais ne semble pas donner une définition de temporaire ou à plus long terme de n'importe où.

9voto

jalf Points 142628

La norme dit qu'il alloue de stockage de jusqu'à n- éléments. En d'autres termes, votre exemple peut retourner un tampon assez grand pour 5 objets seulement.

Il semble assez difficile d'imaginer un cas d'utilisation de ce bien. Peut-être que si vous travaillez sur un très limité en mémoire plate-forme, c'est un moyen pratique d'obtenir "plus de mémoire que possible".

Mais pour une telle contrainte plate-forme, j'imagine que vous auriez contourner l'allocateur de mémoire autant que possible, et d'utiliser un pool de mémoire ou quelque chose que vous avez le plein contrôle.

2voto

OwnWaterloo Points 1426
<pre><code></code><p><em>répondre</em> <em>demande</em>.</p><pre><code></code></pre><p><em>base</em> <em>l’exigent</em>.</p></pre>

2voto

Daniel Muñoz Points 302

Peut-être (juste une supposition) qu'il a quelque chose à voir avec la fragmentation de la mémoire. Si vous fortement de garder l'allocation et la désallocation de l'temporelle de la mémoire, mais à chaque fois que vous le faites, vous allouer à long terme prévu de la mémoire après l'attribution du temp mais avant de le libérer, vous pouvez vous retrouver avec la fragmentation du tas (je suppose).

Ainsi, le get_temporary_buffer pourrait être destiné à un plus-que-vous-voulez-besoin d'une partie de la mémoire qui est allouée une fois (peut-être il y a beaucoup de morceaux prêts pour l'acceptation des demandes multiples), et à chaque fois vous avez besoin de la mémoire, vous obtenez juste un des morceaux. Si la mémoire ne pas être fragmenté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X