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

Já Vánoce juchuchu
oslavím na Lopuchu!

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: rnljuey
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
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*)
huh huh 4.4.2009 21:03  755
Bredy [754]: Nemať Sekoryho. int pole[40] je to samy co int pole[], to samy co int* pole, takze ti to stejne vrati sizeof(int*).
bredy 4.4.2009 20:49  754
template<int n>
void fce(int pole[n]) {
  int a;
  a = sizeof(pole);
}


ale to uz je vyšší dívčí, navíc C++.
sekory Sekory The journey of thousand miles - starts with a single step. 4.4.2009 20:19  752
huh: Aha, to smysl dává, to mě nenapadlo, dík.
huh huh 4.4.2009 20:16  751
Sekory [750]: int pole[] v deklaraci parametrů funkce je úplně to samé, co int* pole. Dokonce i int pole[40] v deklaraci parametrů funkce je úplně to samé, co int* pole. Nezapomeň, že sizeof se vyhodnocuje v době překladu, ne za běhu. A pole v C ani svou velikost nezná.
sekory Sekory The journey of thousand miles - starts with a single step. 4.4.2009 19:58  750
CTo je divný... Proč mi funkce sizeof() vrací u pole jeho velikost, ale když to pak použiju u jiné funkce, kde pole není deklarované hází mi to velikost proměnné

void fce(int pole[]);

void main(){
int i, pole[10];
i = sizeof(pole) //i=40
fce(pole);
....
}

void fce(int pole[]){
int a;
a=sizeof(pole); //zde už má hodnotu jen 4!
}

Nechápu...

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

(c) 2001-2011 Lopuch.cz   
Kontakt