LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.

первый вариант предпочтительней из-за читабельности(надо только отформатировать нормально).

обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.

но поскольку конструкции вида

switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}

при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:

if(x == 0) {...}
else if (x == 10000) {...}
else {}

могут быть смешаные случаи типа

switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;

case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}

в принципе может генериться как два switch оператора, то есть будут две короткие таблицы.

if(x<10000) {
  switch (x) {
  case 0: .... break;
  case 1: .... break;
  case 2: .... break;
  }  
else {
  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  case 10002: .... break;
  }
}

также короткий(мало вариантов) switch типа

  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  }

компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.

Исправление alysnix, :

оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.

первый вариант предпочтительней из-за читабельности(надо только отформатировать нормально).

обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.

но поскольку конструкции вида

switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}

при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:

if(x == 0) {...}
else if (x == 10000) {...}
else {}

могут быть смешаные случаи типа

switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;

case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}

в принципе может генериться как два switch оператора, то есть будет имеется две короткие таблицы.

if(x<10000) {
  switch (x) {
  case 0: .... break;
  case 1: .... break;
  case 2: .... break;
  }  
else {
  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  case 10002: .... break;
  }
}

также короткий(мало вариантов) switch типа

  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  }

компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.

Исходная версия alysnix, :

оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.

первый вариант предпочтительней из-за читабельности.

обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.

но поскольку конструкции вида

switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}

при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:

if(x == 0) {...}
else if (x == 10000) {...}
else {}

могут быть смешаные случаи типа

switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;

case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}

в принципе может генериться как два switch оператора, то есть будет имеется две короткие таблицы.

if(x<10000) {
  switch (x) {
  case 0: .... break;
  case 1: .... break;
  case 2: .... break;
  }  
else {
  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  case 10002: .... break;
  }
}

также короткий(мало вариантов) switch типа

  switch(x){
  case 10000: .... break;
  case 10001: .... break;
  }

компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.