2012-05-11 10 views
11

Guardando al codice sorgente di classe java.nio.DirectByteBuffer, ho trovato questo:Qual è lo scopo del bit-shift int value per zero?

if ((length << 0) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) .... 

Qual è lo scopo di spostare la lunghezza da zero bit? Può essere un'ottimizzazione della perfomance o qualcos'altro?

+7

Non ho mai visto quella parola nel titolo del messaggio utilizzato come in questo contesto. – Marc

+0

Buona domanda. Ho dato un'occhiata al codice sorgente e ho notato che questo idioma è usato più volte. Misterioso. –

+1

Alcuni ragazzi volevano controllare se javac li stava rimuovendo correttamente. –

risposta

3

Fare i << 0 è un non-op. Valuta allo stesso valore di i.

+3

Questo spiega l'output dell'operazione, ma in realtà non spiega la vera domanda: perché scrivere codice per farlo? –

+1

La domanda era, * qual è lo scopo * e la mia risposta indica che non può avere uno scopo ragionevole. – aioobe

+1

@mattb - Se hai intenzione di mettere a segno una risposta, vale la pena di capire quali sono effettivamente le parole della domanda, letteralmente dire. –

16

Penso di averlo risolto.

Negli JavaDocs classe:

// -- This file was mechanically generated: Do not edit! -- // 

Quindi non è la mano codificato. È stato generato da script e lo scrittore di script non ha aggiunto un'ottimizzazione per il caso in cui l'ammontare del bit shift shift è zero.

+0

Per ShortBuffer, IntBuffer, LongBuffer gli offset vengono moltiplicati per 2, 4, 8 ecc. Con spostamento a sinistra. L'ottimizzazione del caso << 0 complicherebbe il codice generazionale senza alcun guadagno pratico. – AutomatedMike

2

Il i << 0 è chiaramente ridondante. Non c'è una buona ragione per un programmatore Java per scrivere questo codice deliberatamente.

direi che questo codice è:

  • scritto da qualcuno che non pensava,
  • scritto da qualcuno che non capisce ciò che l'operatore << fa,
  • il risultato di alcuni refactoring semimeccanici, o
  • originariamente prodotto da una sorta di generatore di codice o traduttore.

Tuttavia, ci sono buone probabilità che il bytecode o il compilatore JIT ottimizzino questo aspetto, o che comunque non abbia un impatto significativo sulle prestazioni.