Se di loop o loop con if

0

Supponendo che il compilatore sia abbastanza intelligente da valutare solo if nel secondo esempio, quale versione dovrebbe (semanticamente) usare e perché?

if (b) {
  for (auto a : as) {
    foo(a);
  }
} else {
  for (auto a : as) {
    bar(a);
  }
}

vs

for (auto a : as) {
  if (b) {
    foo(a);
  } else {
    bar(a);
  }
} 

Spero che questa domanda non sia basata su opinioni.

    
posta user695652 21.06.2016 - 15:37
fonte

3 risposte

5

Se la lingua lo supporta, opterei per:

f = b ? foo : bar;
for (auto a : as) {
    f(a);
}

Questo approccio evita di preoccuparsi se il if viene ripetutamente valutato ed evita la ripetizione del codice.

    
risposta data 21.06.2016 - 15:49
fonte
2

Joker

if (b){
    f = foo;
}
else {
    f = bar;
}
for (auto a : as) {
    f(a);
}
    
risposta data 21.06.2016 - 15:41
fonte
1

Non vengono fornite sufficienti informazioni.

La prima versione presuppone che b sia invariante rispetto a foo () e bar () per tutti i parametri a. La seconda versione presuppone che b non sia necessariamente così invariato e programmi difensivamente.

Probabilmente il compilatore non ha modo di sapere che b è in realtà invariante rispetto a foo () e bar (), e quindi non può tradurre la seconda versione nella prima. L'architettura hardware può o non può permettere che il suggerimento di David Arno sia fatto facilmente.

Se b non è invariante su foo () e bar (), la prima versione è errata. Se b è così invariato, la seconda versione può sprecare una discreta quantità di tempo testando

auto c = b;  // assume invariance and force the compiler to believe it.
for (auto a : as) {
  if (c) {
    foo(a);
  } else {
    bar(a);
  }
}

Quanto sopra assume l'invarianza di b e dice al compilatore di assumerlo ai fini dell'ottimizzazione. Ovviamente, se b non è invariante, è altrettanto negativo della prima versione originale, a un costo di maggiore complessità.

    
risposta data 22.06.2016 - 22:36
fonte

Leggi altre domande sui tag