2009-03-07 8 views
2

J'utilise actuellement des vecteurs comme tableaux de style c pour envoyer et recevoir des données via Winsock.Une manière plus efficace de réutiliser un vecteur comme tableau dans winsock?

J'ai un fichier std :: vector et je l'utilise comme mon "tableau d'octets". Le problème est, j'utilise deux vecteurs, un pour chaque envoi, et un pour chaque recv, mais ce que je fais semble être assez inefficace.

Exemple:

std::string EndBody("\r\n.\r\n"); 
std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0); 
std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin()); 
SendData(); 

SendData appelle simplement envoyer la quantité appropriée de temps et assure que tout fonctionne comme il se doit.

Quoi qu'il en soit. À moins que je ne mette à zéro le vecteur avant chaque utilisation, j'obtiens des erreurs avec des chevauchements. Y a-t-il un moyen plus efficace pour moi de faire ce que je fais? Parce qu'il semble que la mise à zéro de l'ensemble du tampon à chaque appel est horriblement inefficace.

Merci.

+0

Postez le code Envoyer() –

+0

Oops, pour SendData(), je veux dire –

+0

Qu'est-ce que vous essayez de faire réellement? – janm

Répondre

1

vous pouvez utiliser m_SendBuffer.clear()

sinon la méthode end() ne sauriez pas quelle est la taille réelle du tampon. Clear() n'est pas une méthode très coûteuse pour appeler. À moins que vous ne travailliez sur quelque 486 ou quelque chose, cela ne devrait pas affecter vos performances

0

Le fait de ne pas appeler clair signifie-t-il que le vecteur obtient une nouvelle taille de 0? Si le PO utilise le vecteur en tant que partie importante de la mémoire, il doit ensuite appeler redimensionner après avoir effacé pour s'assurer que l'espace approprié est disponible pour les appels à envoyer et à recv. Appeler clear puis redimensionner sur le vecteur serait à peu près le même que de le remplir avec des zéros, n'est-ce pas?

vector::clear

vector::resize

fill

+0

Il ne changera pas l'allocation de mémoire pour le vecteur. Cela est normalement réduit en échangeant avec un vecteur vide temporaire. –

0

Pour autant que je comprends the STL docs, appelant clairement définit simplement la valeur .end() pour être le même que .begin() et la taille des ensembles à zéro , qui est instantanée.

Cela ne change pas la quantité de mémoire allouée ou l'emplacement de la mémoire (tout itérateur sera évidemment invalide, mais les données ont tendance à persister!). Le .capacity() ne change pas et les données ne sont pas stockées ici, comme vous l'avez déjà découvert. Si vous utilisez toujours .begin() .end() et les itérateurs STL pour accéder à la zone, cela n'aura aucune importance. N'oubliez pas que les variables de méthode d'une classe ne sont pas initialisées à moins que vous ne les incluiez dans votre liste d'initialisation. Ajoutant m_SendBuffer(BUFSIZE,0) il pourrait faire l'affaire.

1

On dirait que les autres affiches mettent l'accent sur le coût de l'effacement du tampon ou de la taille du tampon. Pourtant, vous n'avez pas vraiment besoin d'effacer ou de mettre à zéro l'ensemble du tampon, ou connaître sa taille, pour ce que vous faites. Les 'erreurs de chevauchement' sont un problème avec SendData, pour lequel vous n'avez pas publié le code. On peut supposer que SendData ne sait pas quelle quantité de tampon il doit envoyer sauf si les données qu'il contient sont terminées par zéro. Si cette hypothèse est correcte, tout ce que vous avez à faire est zéro-terminer les données correctement.

std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin()); 
m_SendBuffer[EndBody.size()] = 0; 
SendData(); 
Questions connexes