Was ich im Grunde tue, ist, alle Daten einzeln in eine for-Schleife zu kopieren.
int main(int argc, char** argv)
{
messagetest fMessage;
vector<float> fData (1000, 0);
// Create 1000 random values
for (int i = 0; i < fData.size(); i++)
{
fData[i] = rand() % 1001;
}
for (int j = 0; j < fData.size(); j++)
{
fMessage.add_samples(fData[j]);
}
return 0;
}
Aber ich möchte eine Methode wie memcpy verwenden, um den Kopiervorgang zu beschleunigen. Es ist nur eine Idee, die mir in den Sinn kommt. Wenn es völlig falsch ist, korrigiere mich. Die letzte Deklaration in der Headerdatei lautet:
Ich habe keine Ahnung, was diese Methode bewirkt (Mangel an Geschick). Aber es sieht irgendwie aus wie ein Vektor. Vielleicht ist das die Lösung für mein Problem. Wenn ja, habe ich keine Ahnung, wie ich das umsetzen soll.
Haben Sie es profiliert und gesehen, dass es langsam ist? Haben Sie den kompilierten Code überprüft und festgestellt, dass er schlecht optimiert ist?
– Nicht zu gebrauchen
19. März 2013 um 13:23 Uhr
Da dies noch nicht hier ist und ich Einzeiler mag:
Beachten Sie, dass mit demselben Einzeiler auch die Umkehrung möglich ist: std::vector samples = {fMessage.samples().begin(), fMessage.samples().end()};
– Wagner Volanin
9. Juni 2021 um 22:26 Uhr
Nazgul
Ich habe den kürzesten Weg gefunden, den Vektor in das wiederholte Feld zu kopieren:
Es ist wahrscheinlich auch schneller als Ihres, da es die anfängliche Iteration und das Setzen von Werten auf 0 vermeidet.
Die Antwort von @mgild wird implizit die aufrufen RepeatedField(Iter begin, Iter end) Konstruktor, um ein temporäres Element zu erstellen, das einer Verschiebung zugewiesen werden soll. Dasselbe gilt für die Antwort von @nazgul, die ausdrücklich erstellt ein temporäres RepeatedField und tauscht es aus.
Viel einfacher wäre es, die Erstellung eines neuen Objekts zu vermeiden:
Wenn samples Feld bereits nicht leer ist, können Sie anrufen Clear Methode vor.
Intern verwendet dies std::copy (so lange wie fData ist ein Vorwärts-Iterator), ist also genauso schnell wie jede Memcpy-Implementierung, die Sie sich ausdenken.
David Toth
Als Alternative zu der ausgezeichneten Antwort von @mgild, Assign kann auch in dieser Situation verwendet werden, sodass die Daten vor dem Verschieben nicht in ein temporäres kopiert werden.
Ich glaube also nicht, dass der obige Code erfolgreich Daten von fData nach fMessage füllen kann. Es ist total falsch!
Nein tut es nicht. mutable_samples() weist auf a RepeatedField<float>und RepeatedField<float>::mutable_data kehrt zurück float*. Haben etwas Dokumentation.
– Asteroiden mit Flügeln
21. Oktober 2020 um 16:37 Uhr
Nein tut es nicht. mutable_samples() weist auf a RepeatedField<float>und RepeatedField<float>::mutable_data kehrt zurück float*. Haben etwas Dokumentation.
– Asteroiden mit Flügeln
21. Oktober 2020 um 16:37 Uhr
10155000cookie-checkKopieren Sie einen std::vector in ein wiederholtes Feld von protobuf mit memcpyyes
Haben Sie es profiliert und gesehen, dass es langsam ist? Haben Sie den kompilierten Code überprüft und festgestellt, dass er schlecht optimiert ist?
– Nicht zu gebrauchen
19. März 2013 um 13:23 Uhr