Stránka 2 z 2

Re: Jazyk C - funkce a pole

Napsal: 07 čer 2017 17:27
od faraon
Dnes, když se začátečníci jako první jazyk učí Javu, bych tu věčnou modlitbičku o správných návycích radši ani nezmiňoval :lol:

Kód: Vybrat vše

for (unsigned int maska=UINT_MAX-INT_MAX;maska;maska/=2) putchar((maska&cislo)?'1':'0');

Kód: Vybrat vše

for (unsigned int maska=UINT_MAX-INT_MAX;maska;maska>>=1) putchar((maska&cislo)?'1':'0');

Jsi si jistý svým tvrzením a posunech?

Re: Jazyk C - funkce a pole

Napsal: 08 čer 2017 14:04
od cpp
Co je na mém tvrzení o posuvech nejasného?

Kód: Vybrat vše

x = x >> 2;


je ekvivalentní k

Kód: Vybrat vše

x /= 4;


stejně tak

Kód: Vybrat vše

x = x << 4;


je ekvivalentní k

Kód: Vybrat vše

x *= 16;

Re: Jazyk C - funkce a pole

Napsal: 08 čer 2017 17:03
od faraon

Kód: Vybrat vše

x = x >> 2;
SAR 2

Kód: Vybrat vše

x /= 4;
DIV 4

Re: Jazyk C - funkce a pole

Napsal: 08 čer 2017 19:20
od cpp
Optimalizátor udělá z dělení 4 posun o 2 bity.

Re: Jazyk C - funkce a pole

Napsal: 09 čer 2017 01:22
od faraon
Tak proč ten posun nenapsat rovnou, když vím že tam nakonec stejně bude?

Kromě toho, já jsem v tom příkladu nedělil dvěma, ale posouval maskovací bit ;-)

Re: Jazyk C - funkce a pole

Napsal: 09 čer 2017 14:26
od cpp
"Tak proč ten posun nenapsat rovnou, když vím že tam nakonec stejně bude?"

Utrpí tím čitelnost a pružnost kódu.

Re: Jazyk C - funkce a pole

Napsal: 09 čer 2017 15:37
od satik
Částečnej souhlas s cpp, čitelnost kódu by měla bejt na prvním místě, samozřejmě snažit se psát optimalizovaný kód, ale nedělat zbytečně předčasnou optimalizaci, obzvlášť na místech, který se zavolaj třeba jen párkrát za vteřinu.
osobně většinou kód napíšu nějakým jednodušším způsobem a až pak když nějaká část běží pomaleji, než by bylo záhodno, tak se pustím do nějakých dalších optimalizací, nejlíp s využitím profileru, abych neoptimalizoval něco, co stejně nebude mít vliv.

Jinak u bitflagů bych osobně radši viděl asi ten bitovej posun než dělení i kvůli čitelnosti, u toho mě rychlejc trkne, že jde o flagy.

Re: Jazyk C - funkce a pole

Napsal: 09 čer 2017 15:45
od faraon

Re: Jazyk C - funkce a pole

Napsal: 09 čer 2017 17:00
od cpp
To záleží na tom, co má být cílem. Když je skutečně cílem nějaká operace s bity, tak s vymaskováním a posuvy nemám problém. Pokud je ale cílem dělení nebo násobení, tak by tato skutečnost měla být jasná z kódu.

Co když potom zjistíš, že místo dělení 8 potřebuješ dělit 10? Pak to budeš muset přepisovat.

Umět dobře algoritmizovat a zapsat nějakou činnost z tebe dobrého programátora neudělá. Důležité (možná nejdůležitější) sou ty věci okolo - týmová spolupráce, psaní snadno čitelného kódu, umět používat software usnadňující vývoj.

"Proč jsou tam třeba bitové operace, a spousta dalších "špatných" věcí, které se dají udělat na dvacet řádků mnohem čitelněji???"

C tě nevodí za ručičku, nechá tě dělat i ty špatné věci. Umožní ti spoustu věcí, jako používání používání goto, předávání velkých struktur hodnoutou... A zrovna bitové posuny mají smysl ve spoustě případů (fixed point desetinná čisla, atp). Jaký ale mají smysl místo dělení a násobení, když ty bitové posuvy z toho udělá optimalizátor.

Dnešní překladače stojí a padají s optimalizátorem. Vždyť 70-90% času překladu zabírá samotná optimalizace. Tak ten optimalizátor nechte dělat svou práci. Klidně dělejte hloupě jednoduché funkce (KISS), když se bude zdát optimalizátoru výhodné z toho udělat inline funkci, tak to sám udělá...

Dalším "bastlířkým" nešvarem je nadužívání maker. Preprocesor by se měl využívát tam, kde dává skutečný smysl a to sice pro podmíněný překlad.

Tím samozřejmě neříkám, že je nutné se spoléhat jen na optimalizátor, to v žádném případě. Optimalizace by se měly dělat jenom tam, kde mají smysl.