C++ naco jsou hlavičkové soubory když budu psát OOP?

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #30 kdy: 26. 04. 2017, 17:02:18 »
Toto je dôvod prečo C++ považujem za najhorší programovací jazyk aký sa používa. To, že taká primitívna vec ako popísaná tu je tak komplikovaná a záludná je neuveriteľné. Ako toto môže niekto používať a ešte si to chváliť.
Co je na tom složitého? Funguje to out of the box.


anonym

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #31 kdy: 26. 04. 2017, 17:06:09 »
Jasně, už tomu rozumím, prostě mimo scope se staticka alokace vždycky dealokuje. Takže závěrem se dá říct, že když nebudu v kódu, vyjma psaní parametrů metod a funkcí, kde potřebuju předávat odkzem, používat při práci s objekty &objekt, tzn. nebudu pracovat s jejich adresami (nevim ani jaky bych k tomu mel mit duvod), nemůže se mi nijak stát, že narazím na segfault.

Tak to zní jednoduše :)

anonym

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #32 kdy: 26. 04. 2017, 17:08:19 »
Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #33 kdy: 26. 04. 2017, 17:08:51 »

uz si potencialne zadelavas na segmentation fault, kdyz se treba budes pokouset pristupovat k polozkam toho vektoru mimo kontext kde vznikly. Techto oseru je C++ plne. Jestli potrebujes neco podobneho C++, ale done right, zkus radsi Rust, obzvlast kdyz mas svobodu teprve si vybirat.
Kecy, v tomto případě si kolekce dělá kopii nebo move (podle verze/třídy), ale chovat se to bude korektně. Akorát lepší než push je emplace.

A kdyby si neco kopii neudelalo, napr. nejaka custom kolekce, tak by k segfault skutecne doslo v pripade pristupovani k tem objektum z jinaciho scopu? (predpokladam ze scope je myslena hierarchie slozenych zavorech {}  )
Ne, kopii dělá překladač. Pokud se předává hodnotou, překladač se o to postará.

Jasně, chápu že když předáváš hodnou, dělá se kopie. Jenže vector je definován takto:

void push_back (const value_type& val);

Tzn. nepředává se hodnotou, ale odkazem. Nicméně v dokumentaci je uvedeno, ze se bude provadet move nebo copy, takze to nebudu dál rozebírat.

Takže segfaul by mohl vzniknout takhle?

Kód: [Vybrat]

int someGlobal;

void someFunction() {
  int someLocal = 10;
  &someGlobal = &someLocal;
}

void segmentantion_fault() {
  someGlobal = 123;
}

void main() {
  someFunction();
  segmentation_fault();
}

[/quote] Přiřazením ne, spíš při čtení pointru na něco, co už neexistuje. V C++ obecně platí: nepoužívat pointry. Pak se nemůže nic zlého stát. Překladač je dostatečně inteligentní na to, aby se postaral o veškeré kopie a přesuny (move) a když se dodrží pár víceméně univerzálně platných principů, it just works. Princip práce C++ je jednoduchý a STL je dostatečně robustní na to, aby se člověk nestřelil do nohy, když nedělá kraviny (jako třeba použití new).

Sten

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #34 kdy: 26. 04. 2017, 17:11:06 »
Jasně, chápu že když předáváš hodnou, dělá se kopie. Jenže vector je definován takto:

void push_back (const value_type& val);

Tzn. nepředává se hodnotou, ale odkazem. Nicméně v dokumentaci je uvedeno, ze se bude provadet move nebo copy, takze to nebudu dál rozebírat.

Takže segfaul by mohl vzniknout takhle?

Kód: [Vybrat]

int someGlobal;

void someFunction() {
  int someLocal = 10;
  &someGlobal = &someLocal;
}

void segmentantion_fault() {
  someGlobal = 123;
}

void main() {
  someFunction();
  segmentation_fault();
}


Ne, protože do &proměnná se nedá přiřazovat.

(Po opravě překlepů a doplnění návratové hodnoty main):
Kód: [Vybrat]
test.cc:6:18: error: expression is not assignable
            &someGlobal = &someLocal;
            ~~~~~~~~~~~ ^
1 error generated.

Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.

operator new interně používá STL (či make_unique) a move konstruktory slouží právě proto, aby se to pořád nekopírovalo.


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #35 kdy: 26. 04. 2017, 17:14:26 »
Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.
Nejrychlejší je to neřešit. Slovy klasika: "Just use the STL, it's been written by people way smarter than you." Žádné memcopy se nedělá, typicky to je move, což je bez overheadu. Alternativou je použití shared_ptr, ale to už má overhead (počítání referencí).

anonym

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #36 kdy: 26. 04. 2017, 17:21:03 »
Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.
Nejrychlejší je to neřešit. Slovy klasika: "Just use the STL, it's been written by people way smarter than you." Žádné memcopy se nedělá, typicky to je move, což je bez overheadu. Alternativou je použití shared_ptr, ale to už má overhead (počítání referencí).

A jak funguje ten move, předpoladam že se nekopuje cely blok pameti, ale jen adresa? Protoze jinak by to asi nebylo o moc rychlejsi nez memcopy. Takze ten move v podstate by mel fungovat tak, ze znovu alokuje pamet jiz vyhrazenou pro nejakou tu staticky alokovanou promennou a ta pamet pak jiz spada pod scope promenne, do ktere bylo move provedeno, je to tak?

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #37 kdy: 26. 04. 2017, 17:32:13 »
Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.
Nejrychlejší je to neřešit. Slovy klasika: "Just use the STL, it's been written by people way smarter than you." Žádné memcopy se nedělá, typicky to je move, což je bez overheadu. Alternativou je použití shared_ptr, ale to už má overhead (počítání referencí).

A jak funguje ten move, předpoladam že se nekopuje cely blok pameti, ale jen adresa? Protoze jinak by to asi nebylo o moc rychlejsi nez memcopy. Takze ten move v podstate by mel fungovat tak, ze znovu alokuje pamet jiz vyhrazenou pro nejakou tu staticky alokovanou promennou a ta pamet pak jiz spada pod scope promenne, do ktere bylo move provedeno, je to tak?
Alokuje nový objekt a obsah přesune. To už závisí na konkrétním objektu, jak přesně se dělá move.

ava

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #38 kdy: 26. 04. 2017, 18:07:20 »
Přiřazením ne, spíš při čtení pointru na něco, co už neexistuje. V C++ obecně platí: nepoužívat pointry. Pak se nemůže nic zlého stát. Překladač je dostatečně inteligentní na to, aby se postaral o veškeré kopie a přesuny (move) a když se dodrží pár víceméně univerzálně platných principů, it just works. Princip práce C++ je jednoduchý a STL je dostatečně robustní na to, aby se člověk nestřelil do nohy, když nedělá kraviny (jako třeba použití new).

Jak se realizuje třídní polymorfismus v C++  bez new?

Frajer odvedle

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #39 kdy: 26. 04. 2017, 18:09:41 »
Přiřazením ne, spíš při čtení pointru na něco, co už neexistuje. V C++ obecně platí: nepoužívat pointry. Pak se nemůže nic zlého stát. Překladač je dostatečně inteligentní na to, aby se postaral o veškeré kopie a přesuny (move) a když se dodrží pár víceméně univerzálně platných principů, it just works. Princip práce C++ je jednoduchý a STL je dostatečně robustní na to, aby se člověk nestřelil do nohy, když nedělá kraviny (jako třeba použití new).

Jak se realizuje třídní polymorfismus v C++  bez new?

SomeA a = SomeB();

To v Rustu nemate?

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #40 kdy: 26. 04. 2017, 18:13:10 »
Přiřazením ne, spíš při čtení pointru na něco, co už neexistuje. V C++ obecně platí: nepoužívat pointry. Pak se nemůže nic zlého stát. Překladač je dostatečně inteligentní na to, aby se postaral o veškeré kopie a přesuny (move) a když se dodrží pár víceméně univerzálně platných principů, it just works. Princip práce C++ je jednoduchý a STL je dostatečně robustní na to, aby se člověk nestřelil do nohy, když nedělá kraviny (jako třeba použití new).

Jak se realizuje třídní polymorfismus v C++  bez new?
Přes ukazatele. Ono to new je samozřejmě schované v STL, ale explicitně je kravina ho používat, když chce člověk bezpečný kód, takže to chce make_shared apod. Proto má taky C++ auto, aby člověk nezešedivěl při rozepisování typů.

hu

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #41 kdy: 26. 04. 2017, 18:31:11 »
Zboj: Jenže zase, co je potom rychlejší, provádět ústavičně memcopy, nebo prostě alokovat dynamicky? Nebude pak i ta Java rychlejší, než psaní v C++ samým statickým alokováním? Protože sám si řekl, že operator new je lepsi vubec nepouzivat.
Nejrychlejší je to neřešit. Slovy klasika: "Just use the STL, it's been written by people way smarter than you." Žádné memcopy se nedělá, typicky to je move, což je bez overheadu. Alternativou je použití shared_ptr, ale to už má overhead (počítání referencí).

A jak funguje ten move, předpoladam že se nekopuje cely blok pameti, ale jen adresa? Protoze jinak by to asi nebylo o moc rychlejsi nez memcopy. Takze ten move v podstate by mel fungovat tak, ze znovu alokuje pamet jiz vyhrazenou pro nejakou tu staticky alokovanou promennou a ta pamet pak jiz spada pod scope promenne, do ktere bylo move provedeno, je to tak?
Alokuje nový objekt a obsah přesune. To už závisí na konkrétním objektu, jak přesně se dělá move.

Tak obecně je move konstrukce efektivnější jen v případě, že se v dané třídě odkazuje na nějaká dynamicky alokovaná data. Obyčejné membery stejně musíš zkopírovat.

Anonym

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #42 kdy: 26. 04. 2017, 18:51:25 »
Tyy vole co to zas ma byt to Object slicing, proc sakra nejde jednoduse udelat

A a = ChildOfA()

?

Jak bych fakt nekoho videl vyuzivat v kodu jakymkoliv zpusobem object slicing, tak bych ho normalne poslal do pejci. Jazyk by vubec nemel neco takoveho umoznovat.

Uz chapu, proc se tolik lidi vysralo na statickou alokaci a proste vsude v C++ pouzivaji operator new, to aby nemuseli resit a chapat tyhlety C++ srajdy, to nemuze chtit zadny normalni clovek chapat. Ty vole dyt to je horsi nez javascript. Kaslu na C++ a napisu si to v Céčku, ja na blbosti nemam cas. C++ vypada asi tak, jako uz od pohledu ten blazen Soustrup.

hu

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #43 kdy: 26. 04. 2017, 18:58:00 »
Tyy vole co to zas ma byt to Object slicing, proc sakra nejde jednoduse udelat

A a = ChildOfA()

?

Jak bych fakt nekoho videl vyuzivat v kodu jakymkoliv zpusobem object slicing, tak bych ho normalne poslal do pejci. Jazyk by vubec nemel neco takoveho umoznovat.

Uz chapu, proc se tolik lidi vysralo na statickou alokaci a proste vsude v C++ pouzivaji operator new, to aby nemuseli resit a chapat tyhlety C++ srajdy, to nemuze chtit zadny normalni clovek chapat. Ty vole dyt to je horsi nez javascript. Kaslu na C++ a napisu si to v Céčku, ja na blbosti nemam cas. C++ vypada asi tak, jako uz od pohledu ten blazen Soustrup.

No tak jako představa, že přijdu k C++ a za dva dny se ho naučím, je značně pomýlená. Je to powerfulní, ale komplexní jazyk.

y

Re:C++ naco jsou hlavičkové soubory když budu psát OOP?
« Odpověď #44 kdy: 26. 04. 2017, 18:58:57 »
Toto je dôvod prečo C++ považujem za najhorší programovací jazyk aký sa používa. To, že taká primitívna vec ako popísaná tu je tak komplikovaná a záludná je neuveriteľné. Ako toto môže niekto používať a ešte si to chváliť.
Ale ono je to naprosto jednoduchy. Jen o tom musis neco vedet a nemyslet si, ze kdyz znas python a javascript, tak s tim vystacis.