Gibt es eine Einschränkung für die Nutzung neuer Platzierung anstelle einer Bewegungszuweisung für eine EmpleD_back -ImiC++

Programme in C++. Entwicklerforum
Anonymous
 Gibt es eine Einschränkung für die Nutzung neuer Platzierung anstelle einer Bewegungszuweisung für eine EmpleD_back -Imi

Post by Anonymous »

Ich habe versucht, eine Emplace_back -Methode für ein statisch großer Array (zum Spaß) zu implementieren. Bediener, Konstruktor verschieben, Konstruktor und Standardkonstruktor kopieren. Jeder dieser Operatoren/Konstrukteure Ausgabe eine eindeutige Zeichenfolge, um zu bedeuten, dass er aufgerufen wurde.

Code: Select all

#include 
#include 
#include 

struct point{
int X; int Y;
point(): X(0), Y(0) {
printf("D ");
}
point(int X, int Y): X(X), Y(Y) {
printf("P ");
}
point(const point& Point): X(Point.X), Y(Point.Y) {
printf("C ");
}
point(point&& Point): X(Point.X), Y(Point.Y) {
printf("M ");
}
point& operator=(const point& Point){
X=Point.X;
Y=Point.Y;
printf("CA ");
return *this;
}
point& operator=(point&& Point){
X=Point.X;
Y=Point.Y;
printf("MA ");
return *this;
}
~point(){
printf("DS ");
}
};
Ich habe eine Vorlagenklasse Array , die ein generisches Typelement akzeptiert und ein statisches Array von Elementen speichert. EmpleBackma , der den Konstruktor von Element dann aufruft und dann die Instanz des Elements an der Vorderseite des Arrays zuweist
Ein anderer als EmplaBackpn , der den Destruktor des Elements an der Vorderseite des Arrays aufruft.

Code: Select all

template 
struct array {
public:
element Buffer[10];
size_t Size = 0;
public:
template
void EmplaceBackMA(ctorargs&&... Args){
Buffer[Size] = element(std::forward(Args)...);
++Size;
}
template
void EmplaceBackPN(ctorargs&&... Args){
Buffer[Size].~element();
new(Buffer + Size) element(std::forward(Args)...);
++Size;
}
};
Beim Testen von beiden EmplaBack mit dem folgenden Code habe ich die folgende Ausgabe erhalten.

Code: Select all

int main(){
puts("Creating Particles");
array
 Particles; //DDDDDDDDDD
puts("\nEmplaceBackMA");
Particles.EmplaceBackMA(4, 4); //P MA DS
puts("\nEmplaceBackPN");
Particles.EmplaceBackPN(4, 4); //DS P
puts("\nEndingProgram");
//Is Placement New Better?
}
< /code>
Ausgabe: < /p>
Creating Particles
D D D D D D D D D D
EmplaceBackMA
P MA DS
EmplaceBackPN
DS P
EndingProgram
DS DS DS DS DS DS DS DS DS DS
Es scheint, dass die Platzierung neu ein vorübergehendes Punkt von Punkten erstellt Sollte wahrscheinlich schneller sein und wahrscheinlich besser zu verwenden als Bewegungszuweisung zu verwenden. ein Grund als Antwort.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post