<vector> und memcpy() ?
-
markusrw schrieb:
Man kann doch einen Pointer auf die Daten anfordern, soweit ich weiß.
Dann müsste es nämlich auch gehen, oder nicht?Das ist das Problem, ich wüßte gerne wie. Wie schon gesagt vector Adresse ist nicht gleich Daten Adresse.
-
Moment, muss mal nach der Funktion schauen.
Kenn die grad nicht auswendig.^^vector<int>::pointer ptr = &v[0];http://msdn2.microsoft.com/en-us/library/7e4tx21z(VS.80).aspx
Müsste das sein, was du suchst.
Aber wenn du gleich den Speicher selbst manipulierst, verwende doch gleich einen normalen Array bzw. einen Pointer auf einen Speicherbereich.^^
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
markusrw schrieb:
Aber wenn du gleich den Speicher selbst manipulierst, verwende doch gleich einen normalen Array bzw. einen Pointer auf einen Speicherbereich.^^
vector ist trotzdem besser, zumindest besser als ein zeiger auf einen speicherbereich, den du selbst verwalten musst.
-
Was spricht denn nun gegen std::copy?
MfG SideWinder
-
memcpy ist für einen Vector von (komplexen) Objekten darüberhinaus nicht geeignet. Nehmt doch einfach die dafür vorgesehenen Algorithmen. (s.a. SideWinder)
-
von memcpy sollte man in C++ möglichst die Finger lassen, wenn man mit Objekten arbeitet. Das umgeht nämlich sämtliche Konstruktoren (was vor allem bei nichttrivialen Ctoren tödlich ist) und treibt daher Schindluder mit Objektlebenszeiten usw.
-
Nichts desto trotz hat er gefragt, ob es geht. Es gibt Fälle (alte API's), da ist es sinnvoll.
Man kann es, und man darf es:std::vector<T> src(N); memcpy(tgt, &src[0], N * sizeof(T));
-
Tachyon schrieb:
Es gibt Fälle (alte API's), da ist es sinnvoll.
Man kann es, und man darf es:Sinnvoll ist die eine Frage, denn ich würde behaupten dass std::copy auf entsprechend primitiven Arrays genau dasselbe leisten kann.
Können und dürfen darf man es nur, wenn T ein POD ist (oder man sehr genau weiß, was man tut).
-
LordJaxom schrieb:
Tachyon schrieb:
Es gibt Fälle (alte API's), da ist es sinnvoll.
Man kann es, und man darf es:Sinnvoll ist die eine Frage, denn ich würde behaupten dass std::copy auf entsprechend primitiven Arrays genau dasselbe leisten kann.
Können und dürfen darf man es nur, wenn T ein POD ist (oder man sehr genau weiß, was man tut).Klar, man kann erstmal ein C-Array in seine Alt/C-API reinschieben, und dann std::copy benutzen. Aber dabei kann es genauso an den Grenzen knallen, wenn der Benutzer nicht weiss was er tut. Es ging mir mit meiner Antwort auch gar nicht mal so sehr konkret um memcpy sondern ganz allgemein um alte API's.
Außerdem muss man nicht bei jeder Frage eine Grundsatzdiskussion starten, sondern vielleicht einfach mal voraussetzen, dass der Fragensteller ansonsten weiss was er tut und eine Antwort geben. Vielleicht noch mit einem Hinweis auf die Gefahren.
-
Es ging mir mit meiner Antwort auch gar nicht mal so sehr konkret um memcpy sondern ganz allgemein um alte API's.
...von denen im Ursprungspost nicht die Rede war. Gut, man hätte im späteren Post von DX Buffer auf die DirectX-API schließen können, aber das muss auch nicht unbedingt jeder kombinieren, der nichts damit am Hut hat.
Außerdem muss man nicht bei jeder Frage eine Grundsatzdiskussion starten, sondern vielleicht einfach mal voraussetzen, dass der Fragensteller ansonsten weiss was er tut und eine Antwort geben.
Die Antwort wurde gegeben und lautet: Memcpy in C++ ist gefährlich, weil es keine Kopiersemantik berücksichtigt. Nimm lieber std::copy, denn dieses hat ggü. memcpy keine Nachteile, aber es beachtet Kopiersemantik, falls die Objekte nicht primitiv sind.
Die Grundsatzdiskussion entsteht nur, weil immer wieder irgendjemand einen Einwand a la "ja, aber, man kann xyz in diesen und jenen Fällen ja doch..." bringen muss. Wenn es darum geht hat Braunstein eine (die) Antwort direkt im zweiten Post gegeben.
-
gibts es nich sowas wie
std::vector<T> A; std::vector<T> B(A);
-
Die Frage, die man zuerst stellen sollte, ist folgende:
Muss der Inhalt des vectors denn überhaupt kopiert werden? Da sich &v[0] genauso verhält wie ein C-Style Array des template Typs kann man es überall dort verwenden, wo ein C-Style Array erwartet wird.Gruß,
Doc