|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: 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..
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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: Fri Jul 31, 2009 2:52 pm Post subject: |
|
ok, paldies! |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: 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ā |
|
Back to top |
|
|
|
|
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
|