2009-03-07 2 views
2

Ich verwende derzeit Vektoren als c-artige Arrays zum Senden und Empfangen von Daten über Winsock.Effektivere Art, Vektor als Array in Winsock wiederzuverwenden?

Ich habe einen Std :: Vector und ich verwende das als meine 'Byte-Array'.

Das Problem ist, ich verwende zwei Vektoren, einen für jeden senden, und einen für jeden recv, aber was ich tue, scheint ziemlich ineffizient zu sein.

Beispiel:

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 nennt nur die entsprechende Menge an Zeit senden und stellt sicher, alles funktioniert, wie es sollte.

Wie auch immer. Wenn ich den Vektor vor jeder Verwendung nicht auf Null setze, bekomme ich Fehler mit Überlappungen. Gibt es einen effizienteren Weg für mich, das zu tun, was ich tue? Weil es so aussieht, als wäre es völlig ineffizient, den gesamten Puffer bei jedem Aufruf auf Null zu setzen.

Danke.

+0

Beitrag der Code für Send() –

+0

Hoppla, Senddata(), ich meine –

+0

Was wollen Sie eigentlich zu tun? – janm

Antwort

1

können Sie m_SendBuffer.clear() verwenden

sonst das Ende() -Methode würde nicht wissen, was die wirkliche Größe des Puffers ist.

clear() ist keine sehr teure Methode, um anzurufen. Wenn du nicht an etwas 486 oder etwas arbeitest, sollte es deine Leistungen nicht beeinflussen

0

Wäre nicht klar, dass der Vektor eine neue Größe von 0 bekommt? Wenn das OP den Vektor als einen großen Speicherblock verwendet, dann müssten sie die Größenänderung nach dem Löschen aufrufen, um sicherzustellen, dass der geeignete Platz für Anrufe zum Senden und Empfangen verfügbar ist.

Aufruf klar, dann Größe ändern auf dem Vektor wäre um das gleiche wie nur mit Nullen füllen wäre es nicht?

vector::clear

vector::resize

fill

+0

Die Speicherzuordnung für den Vektor wird nicht geändert. Das wird normalerweise durch den Austausch mit einem temporären leeren Vektor reduziert. –

0

Soweit ich the STL docs verstehen, rufen klar setzt einfach die .end() Wert der gleiche wie .begin() und setzt Größe auf Null zu sein Das ist sofort.

Es ändert nicht die Menge an Speicher zugeordnet oder wo der Speicher ist (jeder Iterator wird offensichtlich ungültig sein, aber die Daten neigen dazu, zu verweilen!). Die .capacity() ändert sich nicht und auch nicht die dort gespeicherten Daten, wie Sie bereits festgestellt haben. Wenn Sie immer .begin() .end() - und STL-Iteratoren verwenden, um auf den Bereich zuzugreifen, spielt dies keine Rolle.

Vergessen Sie nicht, dass Methodenvariablen einer Klasse nicht initialisiert werden, es sei denn, Sie fügen sie in Ihre Initialisierungsliste ein. Hinzufügen m_SendBuffer(BUFSIZE,0) dort könnte den Trick tun.

1

Scheint wie die anderen Plakate konzentrieren sich auf die Kosten für das Löschen des Puffers oder die Größe des Puffers. Aber Sie müssen nicht wirklich den ganzen Puffer löschen oder löschen oder seine Größe für das, was Sie tun, wissen. Die "Fehler mit Überschneidungen" ist ein Problem mit SendData, für das Sie den Code nicht gepostet haben. Vermutlich weiß SendData nicht, wie viel des Puffers gesendet werden muss, es sei denn, die darin enthaltenen Daten sind null-terminiert. Wenn diese Annahme richtig ist, müssen Sie nur die Daten null-terminieren.

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