Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Komu se nelení,
tomu se zelení.

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: jenxyci
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
bredy 9.5.2009 22:46  778
GumyshJe to naprosto správně. Ta funkce vrací referenci,nicméně umí vrátit i null referencí. Je to přesně fuj! a programátor by si to neměl nikdy dovolit. Řešení jsou dvě.Vracet ukazatel,nebo místo null,vyhazovat výjimku.Platí pravidlo,že pokud něco někde vrací ukazatel,musím předpokládat,že může vrátit null.V případě reference to musí vždy vrátit odkaz na platný objekt.
gumysh 9.5.2009 09:03  777
Mno, pokud getUnMarshaledData() vraci ukazatel, tak prekladac nespis cedi skrz zuby i nejake varovani a k uvedene podmince nikdy nedojde; nicmene pokud rikas, ze to funguje a je to jen spatne z hlediska kultury, tak tipuji, ze prislusna funkce vraci referenci a (o moje dobroto) dovoluje si vracet dereferencovany null pointer (tj. "null referenci", kdyby tak sproste slovo melo misto v mem slovniku).
bredy 5.5.2009 12:44  776
mptsHezky... :-)
mpts mpts Je to jinak, ba přesně naopak! 5.5.2009 12:33  775
Bredy [774]: Tak to je snadné a zřejmé: chybí tomu barvy!


if (&(builder.getUnMarshaledData()) == 0)
    throw  Fault_t(builder.getUnMarshaledErrorNumber(),
                   builder.getUnMarshaledErrorMessage());


bredy 5.5.2009 10:34  774
Takovej malej kvízCo je na tomhle zápisu špatně:

    if (&(builder.getUnMarshaledData()) == 0)
        throw  Fault_t(builder.getUnMarshaledErrorNumber(),
                       builder.getUnMarshaledErrorMessage());


Je to vidět na první pohled, bez nutnosti znát prostředí (mimochodem, projekt je OpenSource FastRPC). Uvedená konstrukce funguje, akorát špatně je to z hlediska jakési "štábní kultury"
davpe Davpe 10.4.2009 09:35  773
jasne, na C++ planuju v budoucnu prejit, ale zatim me neuveritelne chytlo Cecko. tak malo veci, a tak velka sila :) a dosahnul jsem presne toho, co jsem potreboval :)
bredy 10.4.2009 09:29  772
DavpeOno to vždycky "nějak" půjde. Otázkou je, jak velkou míru abstrakce jsi s tím systémem "nejak" dosáhnout a jakou to má míru univerzálnosti. Proto se radši uchyluji k C++, kde už nejde o žádný "hack" ale o čistější návhr nabízející mnohem lepší parametry.
davpe Davpe 10.4.2009 09:14  771
no vida, ja si myslel, ze to ani nejde a ja mam dokonce na vyber :D kazdopadne jsem si vybral ukazatel na void a funguje to naprosto skvele a bezproblemove. diky moc!
bredy 10.4.2009 08:36  770
DavpeVíceméně máš několik možností:
a) Makro (implementace příkazů zásobníku makrem, s tím, že jedním parametrem je typ)
b) ukazatel na void (void *)
c) také by to šlo prvky kopírovat do nějakého binárního pole typu char, s tím, že víš, kolik bytů zabírá prvek.
d) Kombinace (třeba a)+c) )
davpe Davpe 10.4.2009 08:29  769
Hoj ;) Ja vim, ze v C neni OOP, ale je tu vubec mozne aspon nejaka znovupouzitelnost? Jde mi o to, ze kdyz si naprogramuju zasobnik pro urcity datovy typ (treba int), jak to udelat, abych jej mohl popuzit i pro jakykoliv jiny DT a oba tyto zasobniky pouzit v jednom programu. datovy typ mam pres typedef. Jde to vubec?
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 5.4.2009 23:29  768
Bredy [764]: Mas pravdu, a proto jsem taky nechtel, aby muj prispevek vyznel "neoptimalizujte". Muj prispevek mel byt spise "optimalizujte predevsim tam, kde to bude mit nejvetsi efekt". Ono rekl bych, ze naprosta mensina z nas pise nejake knihovny, kde pak clovek musi premyslet na kazdem kroku. Nicmene presne ty priklady, ktere uvadis, kde neco bezi 10 hodin versus 9 hodin, pripadne kde rozdily byvaji desitky ci stovky procent, obvykle nebyvaji tim, ze by nekdo zvolil ArrayList, kdyz mel sahnout po LinkedListu (omlouvam se za Javu, ale prece jenom je mi to blizsi), ci obracene, ale spise napriklad tim, ze misto jednoho hromadneho updatu tisice radku v DB dela v cyklu tisic updatu jedineho radku. V takovymhle pripade je pak uz uplne jedno, jestli nekde jinde optimalizoval veci toho charakteru, na ktery jsem narazel.
huh huh 5.4.2009 22:50  767
Že jste to vy, tak jsem pro vás vyrobil userscript pro FF, který umí zvýraznit syntaxi C++. Po jeho nainstalování se v tomto klubu pod textareu pro psaní příspěvku přidá druhá, do které když nakopírujete nějaký kód a kliknete na Zvyrazni, tak se převede na HTML a přidá k příspevku.

Za funkčnost neručím, testováno minimálně, snášenlivost s jinými userscripty netestována vůbec. Získat lze zde.
Jste programátoři, takže error reporty posílejte rovnou s bugfixama, thnx :-)
bredy 5.4.2009 21:06  766
SekoryNejvětší problém šablon je, že se nejedná o funkce, ale o vzory. Funkce z toho teprve vznikne podle použití a to na míru toho co jí zadáš za parametry. A tady je kámen úrazu, protože šablona musí být viditelná všude, kde ji použíješ (celá, včetně těla). Jinak by ji překladač neuměl vygenerovat na míru. Asi jako u makra. Nelze jo tedy pouze nadeklarovat do H souboru a do souboru CPP dát tělo.

Ono to tedy takhle taky jde, ale vyžaduje to, aby někdo do toho CPP nechal vygenerovat všechny varianty, které se používají v celém programu. Jinak ti linker zahlásí onu typickou hlášku o tom, že nemůže najít symbol (funkci), protože zrovna její varianta nebyla vygenerována. Proto se raději šably rvou celé do hlavičkových souborů.
sekory Sekory The journey of thousand miles - starts with a single step. 5.4.2009 20:59  765
Kdokoliv: No to máš samozřejmě pravdu, nicméně si nemyslím, že je od věci se nad tím někdy pozastavit než rychlost naprosto ignorovat.
bredy 5.4.2009 20:57  764
KdokolivTohle je dvousečné. V případě, že vyvíjíš něco, kde nejde o rychlost, pak máš jistě pravdu. Jenže. Objektové programování je často re-use, tedy nikdy nevíš dopředu, kdy tento kód znova použiješ. Pokud se zrovna zaměřuješ apriory na psaní nějakých knihoven, pak je to už na zvážení. Je to o tom, kolik času a peněz chceš vrazit do problému a jak moc tě ten problém trápí, a hlavně, jaké ambice má ten problém v budoucnu.

A jinak to samé i s pamětovou náročností. Je na zvážení, zda program, který trvá X, ale mohl by trvat X*0.9 bude počítat v prvním 10 hodin a v druhém jen 9 (a budu mít hodinku zapařit si nějakou gamesu :-) A opět, je na zvážení, jestli program, který by mohl do paměti uložit 10000položek jich místo toho dokáže uložit třeba 11000, A třeba se těch 1000 položek už nevejde po paměti a musí být odswapovaných. Pak si nepřej vidět, jak to program zpomalí.

Bohužel, v současné době nejde o procenta ale spíš o desítky a stovky procen, o kolik bývají programy pomalejší, než by mohly být.


huh
Máš samozřejmě pravdu. Ta funkce se nejprve inlinuje a přitom její obsah se vyhodnotí jako konstanta, takže ve výsledku tam je normálné cmp na konstantu. Tohle je obrovská výhoda šablon. Překladač má o šablonách obrovské množství informací a tak spoustu nástrojů a způsobů, jak kód optimalizovat. Díky tomu, že šablony se instancují někde na úrovni "po" lexikální analýze, je schopen překladač vytvořit kód na míru danému typu, který se mnohem lépe optimalizuje, než by se třeba dělo s nějakou formou bytecode, kde těch informací už je řádově méně.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt