Permalänk
Medlem

Initialization och Assignment

Är fortfarande en relativt ny C++ programmerare, och experimenterar runt med saker och ting. Har nyligen läst Effective C++, mycket trevlig bok men fastnade på en sak, och det var just assignment och initialization.

Exempel:

int a(9); // Initialization
a = 5; // Assignment
int a = 5; // Initialization

Och det hela där är ju logiskt, men sen kommer jag till string.

string a("what"); // Initialization
a = "what"; // Assignment
string a = "what"; // Vad exakt händer här?
På den sista kan jag se två möjligheter:
- Att först kallas string a(); sen a = "what"; det vill säga operator=.
- Att compilern skulle optimera detta till string a("what");

Att söka efter detta verkar främst resultera i enkla built-in värde så som int, eller initalization lists (som jag förstår till fullo).

Edit: Här verkar jag dock hittat liknande det jag frågar efter.
http://www.softwareandfinance.com/CPP/FAQ_Assign_Init.html

Shape a(10, 20); // calls the parameterized constructor Shape b = a; // called initialization and calls the copy constructor Shape c(b); // called initialization and calls the copy constructor Shape d; d = c; // called assignment and calls the assignment operator

Visa signatur

| Antec P183 | AMD Phenom 2 940 | Corsair XMS2 DDR2 8192 MB | XFX HD4870 | Gigabyte MA-790X-UD3P | Corsair VX 450W | Primärt OS: Arch Linux | Windows 7 x64 |

Permalänk
Skrivet av Glaucous:

På den sista kan jag se två möjligheter:
- Att först kallas string a(); sen a = "what"; det vill säga operator=.
- Att compilern skulle optimera detta till string a("what");

Som du säger, det finns en god chans att kompilatorn kan hantera detta på ett bra sätt.

Det bästa sättet för dig att se vad som faktiskt händer är att kompilera programmet och sen sätta en brytpunkt och välja att kolla på Disassembly (Debug -> Windows -> Disassembly i VS2010) och se vilka instruktioner som faktiskt genererats, och på detta sätt lära dig vilka optimeringar du kan räkna med att kompilatorn gör.

Observera att om du kör i Debug så görs nästan inga optimeringar alls, så kompilera i Release och kolla sen.