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

Což takhle
dát si Lopuch?

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: cshiwgf
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
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ě.
huh huh 5.4.2009 17:35  763
No ten countof pomalejší nebude, ten se stejně vyhodnotí v době kompilace, takže ho kompilátor nejspíš prostě nahradí hodnotou.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 5.4.2009 16:45  762
Teda tyhle narazky na pomalost me nikdy neprestanou fascinovat. Ano, pravdepodobne to o neco pomalejsi bude. Ale pokud clovek nevyviji aplikaci pro nejakej hodne specialni pomalej hardware nebo pro nejakej hodne specialni hardware, kde veci musej bezet v realtime, nebo pokud clovek takovouhle operaci nedela uvnitr cyklu, kterej je opakovanej stomiliardkrat, tak resit takovyhle rychlostni zalezitosti mi prijde lehce usmevne. Zvlast kdyz o padesat radku dal se (treba) aplikace pripojuje do databaze, nad kterou nejsou vhodny indexy ci podobne...
sekory Sekory The journey of thousand miles - starts with a single step. 5.4.2009 14:57  761
Já to naštěstí nijak nepotřeboval, jen mě prostě napadlo, že místo abych předával fci proměnou navíc, která mi udává velikost pole, tak použiju sizeof. Nicméně mi nedošlo jak to přesně funguje, což mi huh osvětlil. Myslim si ale, že je pro mě asi nejlepší předat o proměnou víc, než se pouštět do věcí co popisuje Bredy (i kdybych chtěl použít C++), navíc kdoví, jestli to nakonec není třeba pomalejší...
huh huh 5.4.2009 13:16  760
Ale jo, je to šikovný, akorát já v C++ moc klasický pole nepoužívám a v C to bohužel nejde :-)
bredy 5.4.2009 13:10  759
huhJasně, tady nešlo ani tak o použitou technologii, jako o to, že to opravdu "někdy" jde. Jen už jsem si nepamatoval ten zápis, musel jsem se podívat. Uvedený postup používám hlavně k implementaci funkce countof, což je podobné jak sizeof, s tím, že vrací počet prvků pole, nikoliv jeho velikost v bajtech.

for (int i = 0; i < countof(arr); i++) {
   int x = arr[i];
   ...
}
huh huh 5.4.2009 13:04  758
No jo, když použiješ referenci, tak je to něco úplně jinýho.
bredy 5.4.2009 12:45  757
huhNejlepší je praktická ukázka... Jen pravdou je, že můj příklad není úplně korektní, takže to opravíme:

#include <stdio.h>

template<int n>
void foo(int (&arr)[n]) {
	int sz = sizeof(arr);
	printf("size: %d\n",sz);
}

int main(int c, char **v) {
	int a[40];
	foo(a);
}

A výsledek?
ondra@linda:/tmp$ g++ test.cpp -o test
ondra@linda:/tmp$ ./test
size: 160
ondra@linda:/tmp$
huh huh 4.4.2009 21:06  756
Ve skutečnosti můžeš v C (c99) napsat:
void fce(int n, int pole[n])
ale nic ti to nepomůže, sizeof(pole) bude furt sizeof(int*)

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

(c) 2001-2011 Lopuch.cz   
Kontakt