Situace A)
inline void funkce(){
int max = 10;
for (int i=0; i<max; i++)
std::cout << i << ","
}
Situace B)
inline void funkce(){
int max = 100;
int A = 1;
int B = 2;
step=2;
for (int i=0; i<max; )
{
if (A==1)
i++;
if (B==2)
i=step;
std::cout << i << ",";
... // do something
}
}
Zajímalo by mě jestli se ve scénáří A po přeložení kompilátorem pracuje s navyšováním proměnné nebo to ten kompilátor dosadí jako konstantu. Mohl by přece usoudit, že když se i nikde dále podmíněně nemění (není závislost mezi i a zbytkem inline funkce) tak může kód přeložit takto:
std::cout << "0,1,2,3,4,5,6,7,8,9,";
neboli místo proměnné dosadit si hodnotu.
U situace B by mě tedy zajímalo, jestli to zvládne i v případě, že se i může navyšovat dvěma způsoby. Dejmetomu, že ty vzniklé situace jsou jen tři, dokázal by to interpretovat třeba takto?
std::cout << "0,1,2,3,4,6,8";
V závislosti na zbytku kódu? Nebo jakmile jsou tam závislosti, tak to kompilátor nedokáže rozebrat a dosadit konstanty za proměnné? Nebo je to až do určité úrovně složitosti apod.?
Ještě přidám jeden dotaz - je známo že do smyček není dobré dávat další smyčky. Bude kód rychlejší, když místo vnořené smyčky dám inline funkci, v případě, že znám přesnou šířku obrazu? Např. při procházení obrazu procházím nejdříve řádky a pak sloupce. A vím že obraz má 256x256 px. Tedy bych mohl udělat inline funkci s for, a ten kompilátor to vyhodnotí tak, že to provede jako 256 samostatných příkazů, jo?
A dále - co podmínky uvnitř cyklu. Nedávat? Podmínky by ten kód mohly prodloužit. A mě napadlo, že některé podmínky se dají dát mimo cyklus, jestliže znám přesnou šířku obrazu. Cyklus bez podmínek by pro kompilátor a inline funkci snad nebyl problém.
Příklad takové funkce:
for (int r = 0; r < gaps.rows; r++)
dst.row(r*gap).copyTo(gaps.row(r));
if ( remains >= 0 )
dst.row(dst.rows-1).copyTo(gaps.row(gaps.rows-1));
akorád, že toto je zrovna ten případ, kdy kompilátor by nemohl vědět, kolik je rows, ale kdybych tam dal konstantu 256, tak už by to mělo jít efektivně přeložit jako serie příkazů.
No a teď si vemte, že bych měl ještě to samé provést na sloupce.
Takže musím procházet řádky a pak sloupce vnořeným cyklem... Tomu bych mohl předejít tím, že přehodím sloupce s řádkami, ale nevím jestli by se to pak vyplatilo. Vzhledem k tomu, že chci obraz pak pixel po pixelu analyzovat (v několika směrech) tak asi jo. Protože bych se vyhnul vnořeným cyklům. Teď narážím na analýzu že kolem pixelu x,y detekuju barvu pixel nad, pod, vlevo a vpravo, nebo pouze vlevo a pouze vpravo; nebo pouze dole a pouze nahoře... takže uvažuju o možnosti jestli se vyplatí vyhnout se vnořeným smyčkám. Vím že smyčka je struktura, ale nefunguje to podobně jako funkce? Sice nepoužívá stack, ale proč by se jinak programátoři snažily vyhnout hloubkovým cyklům při procházení obrazu? Snad kvůli času zápisu do paměti když provádím i++; (první smyčka) r++; (vnořená smyčka)