Gibt es eine Einschränkung für die Nutzung neuer Platzierung anstelle einer Bewegungszuweisung für eine EmpleD_back -Imi
Posted: 02 Apr 2025, 02:38
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.
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.
Beim Testen von beiden EmplaBack mit dem folgenden Code habe ich die folgende Ausgabe erhalten.
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.
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 ");
}
};
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;
}
};
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