dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Jautājumi par C++ saistībā ar efektivitāti

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Fri Jul 31, 2009 12:06 pm    Post subject: Jautājumi par C++ saistībā ar efektivitāti

Man ir daži jautājumi saistībā ar C++, kurus zinoši cilvēki varētu izkaidrot..

Pirmais jautājums ir sakarā ar šādām funkcijām (GetString):
Code:
class Dummy {
public:
   static std::string m_String;
   static const std::string &GetString() { return m_String; }
   static void GetString(std::string &ret) { ret = m_String; }
}

Code:
std::string copy;
copy = Dummy::GetString();
Dummy::GetString(copy);

- Vai šīs abas funkcijas šajā piemērā ir vienādi efektīvas (t.i. kopēšana notiek precīzi 1 reizi)? Varbūt vēl kas būtu jāzina par šiem 2 variantiem?

-------------------------------
Otrais jautājums..

Zemāk uzrakstīju divas pazīstamas metodes interfeisa izveidei, kas pilnīgi noslēpj visas implementācijas detaļas.
Mani māc šaubas par to, kurš no šiem variantiem ir efektīvāks tieši ātruma ziņā (par lietošanas atšķirībām man ir skaidrs).
Pirmais variants ietver virtuālās funkcijas, kas ietver zināmu overheadu.
Otrais variants neietver virtuālās funkcijas, bet darbojas kā proxy.

- Varbūt abu variantu efektivitāte ir vienāda, ja otrajam variantam tāpat ir jādereferencē pointeris uz implementāciju?
- Vai funkciju forwardings otrajā variantā tiek optimizēts(izņemts) kompilerī? Jeb atgriežamās vertības un parametri tiek kopēti 2x, ja nav izmantotas references?
- Varbūt ir vēl cits, labāks variants?

*********** Tīri virtuālais interfeiss (Pure Virtual Interface) ***********

iface.h
Code:
class IFace
{
   public:
      virtual int Func() = 0;
}

impl.cpp
Code:
#include "iface.h"

class Impl : public IFace
{
   public:
      int Func() { return 1; }
}

*********** Privātā implementācija (Cheshire Cat; Pimpl Idiom) ***********

iface.h
Code:
class IFace
{
   public:
      IFace();
      ~IFace();
      
      int Func();
      
   private:
      IFace *impl;
}

impl.cpp
Code:
#include "iface.h"

class Impl : public IFace
{
   public:
      Impl() {}
      ~Impl() {}
      int Func() { return 1; }
}

IFace::IFace() { impl = new Impl(); }
IFace::~IFace() { delete impl; }
int IFace::Func() { return impl->Func(); }

Paldies!
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Jul 31, 2009 2:23 pm    Post subject: Re: Jautājumi par C++ saistībā ar efektivitāti

programmer wrote:
Pirmais jautājums ir sakarā ar šādām funkcijām (GetString):

Visai dīvaini, ka tev tā ir klase. Tur nekādu klasi nevajag - jo tai nav memberu. Pietiek ar parastu neimspeisu:
Code:
namespace Dummy {
   std::string m_String;
   const std::string &GetString() { return m_String; }
   void GetString(std::string &ret) { ret = m_String; }
}


Quote:
- Vai šīs abas funkcijas šajā piemērā ir vienādi efektīvas (t.i. kopēšana notiek precīzi 1 reizi)?

Jā, kopēšana notiek vienu reizi.

Quote:
Mani māc šaubas par to, kurš no šiem variantiem ir efektīvāks tieši ātruma ziņā (par lietošanas atšķirībām man ir skaidrs).

+/- ātrumi būs vienādi. Pirmajā gadījumā kompilators gan var izrādīties gudrāks un noptimizēt nost to virtuālo izsaukumu. It īpaši, ja būs inline funkcija.

Quote:
- Vai funkciju forwardings otrajā variantā tiek optimizēts(izņemts) kompilerī?

Nē, netiks.
Quote:
Jeb atgriežamās vertības un parametri tiek kopēti 2x, ja nav izmantotas references?

Parametru tur nav. Atgriežamā vērtība ir int, kas vienmēr tiek kopēta ļoti ātri.
Back to top
View user's profile Send e-mail
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Fri Jul 31, 2009 2:30 pm    Post subject:

Paldies par info, skaidrāk palika.

Quote:
Visai dīvaini, ka tev tā ir klase. Tur nekādu klasi nevajag - jo tai nav memberu.
Tādas klases man nav, vnk tas bija pirmais, kas ienāca prātā šim piemēram.. Smile

Quote:
Parametru tur nav. Atgriežamā vērtība ir int, kas vienmēr tiek kopēta ļoti ātri.

Šis bija domāts vispārīgi, arī gadījumā, ja tur būtu parametri un atgriežamā vērtība būtu kas smagāks.. tātad es saprotu, ka atgriežot "by value", tādā forwardingā iznāks 2x kopēšana? Un ar "by value" parametriem arī?
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Jul 31, 2009 2:46 pm    Post subject:

Nē, nesanāks nekāda kopēšana. Mūsdienu C++ kompilatori ir pietiekami gudri, lai neko nekopētu, bet tikai aizlektu uz īsto funkciju.
Back to top
View user's profile Send e-mail
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Fri Jul 31, 2009 2:52 pm    Post subject:

ok, paldies!
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Jul 31, 2009 3:00 pm    Post subject:

Ak jā - un lielus objektus padot argumentā by value tev pašam vispār nevajadzētu gribēt, ja vien nav nopietnis iemesls tiešām tā darīt. Tā ka tādām "šaubām" nevajadzētu būt aktuālām :)
Back to top
View user's profile Send e-mail
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: Fri Jul 31, 2009 3:15 pm    Post subject:

Tev taisnība. Man ir tāda tieksme pārlieku pesimizēt principus un kodu, kuru rakstu, ja nezinu, kas tiks optimizēts un kas ne gala rezultātā Very Happy
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group