2 Stimmen

Effizienter Weg zur Wiederverwendung von Vektor als Array in Winsock?

Ich bin derzeit mit Vektoren als C-Stil-Arrays zu senden und empfangen Daten über Winsock.

Ich habe einen std::vector und ich bin mit, dass als meine "Byte-Array".

Das Problem ist, dass ich zwei Vektoren verwende, einen für jedes Senden und einen für jedes Empfangen, 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 ruft send nur die entsprechende Anzahl von Malen auf und stellt sicher, dass alles so funktioniert, wie es sollte.

Wie auch immer. Wenn ich den Vektor nicht vor jeder Verwendung auf Null setze, erhalte ich Fehler mit Überschneidungen. Gibt es einen effizienteren Weg für mich zu tun, was ich tue? Denn es scheint, dass Nullen aus den gesamten Puffer bei jedem Aufruf schrecklich ineffizient ist.

Danke.

1voto

Eric Punkte 18971

Können Sie m_SendBuffer.clear() verwenden

sonst wüsste die end()-Methode nicht, wie groß der Puffer wirklich ist.

clear() ist keine sehr teure Methode, die aufgerufen werden muss. Solange Sie nicht auf einem 486er oder so arbeiten, sollte es keine Auswirkungen auf Ihre Leistung haben

1voto

Kylotan Punkte 18135

Anscheinend konzentrieren sich die anderen Poster auf die Kosten für das Löschen des Puffers oder auf die Größe des Puffers. Dabei ist es für das, was Sie tun, gar nicht nötig, den gesamten Puffer zu leeren oder auf Null zu setzen, oder seine Größe zu kennen. Die "Fehler mit überlappendem Material" ist ein Problem mit SendData, für das Sie den Code nicht gepostet haben. Vermutlich SendData nicht wissen, wie viel der Puffer es braucht, um zu senden, es sei denn, die Daten in ihm ist Null-Terminierung. wenn diese Annahme richtig ist, alles, was Sie tun müssen, ist Null-Terminierung die Daten richtig.

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

0voto

RaptorFactor Punkte 2680

Würde der Aufruf von clear nicht bedeuten, dass der Vektor eine neue Größe von 0 erhält? Wenn der OP den Vektor als einen großen Brocken Speicher verwendet, dann müssten sie dann resize nach Clear aufrufen, um sicherzustellen, dass der entsprechende Platz für Aufrufe zum Senden und Empfangen verfügbar ist.

Der Aufruf von clear then resize auf dem Vektor wäre in etwa dasselbe wie das Füllen mit Nullen, nicht wahr?

vector::clear

vector::resize

füllen.

0voto

Chris Huang-Leaver Punkte 5979

Soweit ich das verstanden habe die STL-Dokumente Der Aufruf von clear setzt einfach den Wert von .end() auf den gleichen Wert wie .begin() und setzt die Größe auf Null, was sofort geschieht.

Es ändert weder die Menge des zugewiesenen Speichers noch den Ort, an dem sich der Speicher befindet (jeder Iterator wird natürlich ungültig sein, aber die Daten neigen dazu, zu verweilen!). Die .capacity() ändert sich nicht und die dort gespeicherten Daten auch nicht, 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 die Methodenvariablen einer Klasse nur dann initialisiert werden, wenn Sie sie in Ihre Initialisierungsliste aufnehmen. Hinzufügen von m_SendBuffer(BUFSIZE,0) könnte dies der Fall sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X