Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50562 Library:100020 in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: Cannot modify header information - headers already sent by (output started at /home/www/novacisko.cz/subdomains/bredy/init.php:11) in /home/www/novacisko.cz/subdomains/bredy/index.php on line 38
Vracíme z funkce objekty - praktická ukázka - Bredyho blog - Ondřej Novák
Bredyho blog - Ondřej Novák

Vracíme z funkce objekty - praktická ukázka

V článku Vracíme z funkce objekty jsem ukazoval, jak probíhá návrat objektu z funkce a jak toto optimalizovat tak, aby se minimalizovalo používání kopírování. Teď si to ukážeme prakticky - použil jsem gcc bez optimalizací


Zdrojový kód

#include <stdio.h>

class TestObject
{
    int instance;
public:
    TestObject(int instance = 9999):instance(instance) {
        printf("TestObject(%d); //Vytvarim objekt 0x%08X instance %d\n",instance,this,instance);   
    }

    ~TestObject() {
        printf("~TestObject(); //Rusim objekt 0x%08X instance %d\n",this,instance);   
    }


    TestObject(const TestObject &other):instance(other.instance) {
        printf("TestObject(const TestObject &other); //Vytvarim kopii 0x%08X z objektu 0x%08X instance %d\n",this,&other, instance);   
    }

    TestObject& operator=(const TestObject &other) {
        instance = other.instance;
        printf("*this = other; //Prirazeni do objektu 0x%08X z objektu 0x%08X instance %d\n",this,&other,instance);
        return *this;   
    }
};

TestObject Neprimo(int inst)
{
    TestObject a(inst);    
    if (inst < 0) {
        TestObject b(-1);
        return b;
    }
    else
        return a;    
}

TestObject Primo(int inst)
{    
    if (inst < 0)
        return TestObject(-1);
    else
        return TestObject(inst);
}


int main(int argc, char *argv)
{
    puts("\n// neoptimalizovane obe strany\n");
    TestObject a;
    a = Neprimo(1);
    
    puts("\n// optimalizovane pouze volajici\n");
    TestObject b = Neprimo(2);
    
    puts("\n// optimalizovane pouze volany\n");
    TestObject c;
    c = Primo(3);

    puts("\n// optimalizovane obe strany\n");
    TestObject d = Primo(4);
    
    puts("\n// destrukce\n");
    
 return 0;   
}

A zde jsou výsledky:

// neoptimalizovane obe strany

TestObject(9999); //Vytvarim objekt 0xBFFBF240 instance 9999
TestObject(1); //Vytvarim objekt 0xBFFBF1D0 instance 1
TestObject(const TestObject &other); //Vytvarim kopii 0xBFFBF230 z objektu 0xBFFBF1D0 instance 1
~TestObject(); //Rusim objekt 0xBFFBF1D0 instance 1
*this = other; //Prirazeni do objektu 0xBFFBF240 z objektu 0xBFFBF230 instance 1
~TestObject(); //Rusim objekt 0xBFFBF230 instance 1

// optimalizovane pouze volajici

TestObject(2); //Vytvarim objekt 0xBFFBF1D0 instance 2
TestObject(const TestObject &other); //Vytvarim kopii 0xBFFBF230 z objektu 0xBFFBF1D0 instance 2
~TestObject(); //Rusim objekt 0xBFFBF1D0 instance 2

// optimalizovane pouze volany

TestObject(9999); //Vytvarim objekt 0xBFFBF220 instance 9999
TestObject(3); //Vytvarim objekt 0xBFFBF210 instance 3
*this = other; //Prirazeni do objektu 0xBFFBF220 z objektu 0xBFFBF210 instance 3
~TestObject(); //Rusim objekt 0xBFFBF210 instance 3

// optimalizovane obe strany

TestObject(4); //Vytvarim objekt 0xBFFBF210 instance 4

// destrukce

~TestObject(); //Rusim objekt 0xBFFBF210 instance 4
~TestObject(); //Rusim objekt 0xBFFBF220 instance 3
~TestObject(); //Rusim objekt 0xBFFBF230 instance 2
~TestObject(); //Rusim objekt 0xBFFBF240 instance 1
vytvořeno: 23.5.2007 11:58:30, změněno: 23.5.2007 11:58:30
Jsou informace v článku pro Vás užitečné?
  • (4)
  • (0)
  • (0)
  • (0)
  • (0)

Podobné články

Vracíme z funkce objekty

Podívejme se blížeji na to, jakým způsobem je implementováno vracení výsledku z volání funkcí. Zboříme při tom všelijaké mýty

Vracíme z funkce objekty - problémy

Při praktickém používání technik Vracíme z funkce objekty narazíme na nečekané a možná nelogické problémy.

Vracíme z funkce objekty - Skrytí konstruktoru

Skrývání konstruktoru může být důležité v případě, že potřebujeme v objektu použít Pimpl Idiom. Objekty totiž mohou vznikat i z datových typů, které nechceme zveřejňovat

Jak provést operaci až po příkazu return

Pokud optimalizujeme kód tak, abychom mohli využít výhod vracení objektu z funkce, narazíme občas na problém, kterak provést některé operace až po provedení příkazu return

FastAllocPool - urychlení častých alokací a dealokací

Pokud v programu z nějakých důvodů potřebujeme často provádět new a delete nad některými třídami, můžeme zvýšit efektivitu těchto operací zavedením poolu předalokované paměti
Reklama: