¿Debería evitarse siempre goto / JMP?

Si está programando en ensamblador, cualquier procesador, usará ramas o saltos o lo que sea equivalente en ese conjunto de instrucciones.

Si está programando en C o en un lenguaje de procedimiento similar, hay ciertas raras excepciones en las que tiene sentido. En cada uno de ellos, el objetivo del goto está en la misma función y generalmente está en un número de línea más alto que el goto. La mejor de estas excepciones es usar goto para implementar el manejo de excepciones en un lenguaje que no lo admite.

Si está programando en un lenguaje orientado a objetos con manejo nativo de excepciones, no debe usar goto sin una muy buena razón que esté bien documentada en el código. Todavía tengo que ver un caso de esto que pase la prueba del olfato en un par de décadas de experiencia.

Afirmas que el código con gotos es más rápido. Con ciertas raras excepciones, el compilador es mejor para optimizar que usted. En su lugar, debe centrarse en hacer que su código sea lo más fácil de entender posible. Si cree que está siendo inteligente, es probable que su código sea demasiado difícil de mantener y debería repensar su enfoque. Antes de que alguien se enoje, esto no se aplica a los algoritmos; Mejorar el rendimiento de O grande es uno de los pocos lugares que puede optimizar significativamente.

“Tengo un presentimiento…”

Alto ahí.

Esto es algo que podría medir y luego razonar sobre los datos dados. Obtenga un compilador decente, aumente la optimización y las advertencias a un nivel decente, y pruebe múltiples enfoques de codificación.

Ahora, compile cada uno de los enfoques para su arquitectura de destino.

Luego, mida el tamaño, la velocidad o cualquier otra métrica que le interese.

Ahora, regrese al mismo código seis meses después e intente hacer algunos cambios no triviales en cada uno de ellos, y considere cuán frágil (o no) es cada versión.

Puede encontrar que la versión que contiene goto es un poco más rápida o más pequeña en algunos casos, pero menos fácil de razonar, modificar y mantener. O, tal vez contrario a su intuición, el código que contiene goto resultó más grande y / o más lento. Los compiladores a veces pueden ser sorprendentes.

No creo automáticamente que goto sea ​​malo. Hay algunos lugares donde realmente es la mejor respuesta. Son pocos y distantes entre sí. Debido a que escribo código C en un entorno incrustado, escribo quizás una o dos declaraciones goto por año. Probablemente se dividen en una de dos categorías: “ruta de limpieza de salida de error” o “salir de un nido de bucle múltiple”.

También he descubierto que demasiada inteligencia por adelantado en busca de algún beneficio percibido en el rendimiento es a menudo una pérdida de tiempo. O la ganancia no es medible, o es medible pero leve. En comparación con el costo de mantenimiento, a menudo no vale la pena.

Al final, no hay sustitución para la medición.

No, goto / JMP no siempre debe evitarse.

El menosprecio que uno ve para goto / JMP suele ser la programación de culto a la carga : la adopción de la convención de otra persona sin entenderlo realmente.

Escriba lo que haga que el código sea más fácil de entender o, en casos excepcionales en los que la diferencia es de suma importancia, lo que haga que el código se ejecute más rápido.

No, no deben evitarse. Como cualquier otra característica del lenguaje, no se debe abusar de ellos. Después de todo, cada condicional incluye un goto implícito.

Los gotos son a menudo una forma más limpia de escribir la entrega de errores cuando hay una serie de condiciones que deben verificarse, en comparación con un nido gigante de bloques condicionales. Los bucles de eventos a veces son más limpios con gotos. Usar una tabla de bifurcación con un goto puede ser una optimización de velocidad efectiva.