pregunta para los expertos en #define - página 3

 
Alexandr Andreev:


Todo el mundo parece entender.....

Así que esto es para aquellos que están empezando su camino....

Podemos envolver todo en una clase stat y devolver una referencia, que luego igualar el resto ya que este método tiene un menos cuando se trabaja con if (a!=5) Print(a); esto no funcionará, siempre se debe escribir if (a!=5) {Print(a);}, en las clases se puede corregir este momento, pero soy demasiado perezoso)) y en general, parece que todo está en los archivos de la historia

el camino con las clases, inicializar nuestros datos a través de método estático y combinar la llamada del operador nuestra impresión.... entoncessi (a!=5) Print(a); , funcionará

Todo esto es por pereza. Me dejé llevar, pero me rendí. Reducido algo, pero a un razonable. Además de las impresiones, la escritura en el archivo es la recogida de datos, o la elaboración del algoritmo, la configuración. Y si se marcan tangas predeterminadas en la impresión, se imprimirán comas. En definitiva, entrena el cerebro, por supuesto, pero ni siquiera muestra el camino.

 
Alexandr Andreev:



Dmitry Fedoseev:


Vladimir Simakov:


Por cierto, ¿puedo hacerle una pregunta? ¿Cuál es la diferencia entre una definición y una llamada de función para el compilador? He llegado a la conclusión de que no lo es. ¿Me equivoco?

 
Valeriy Yastremskiy:

Por cierto, ¿puedo hacerle una pregunta? ¿Cuál es la diferencia entre una definición y una llamada de función para el compilador? He llegado a la conclusión de que no lo es. ¿Me equivoco?

Define es una sustitución durante la compilación BEFORE, por lo que __LINE__ se convierte exactamente en lo que debería ser, puede sustituir un fragmento de código incompleto.

Y la función es referencia de código (goto) en muchos lenguajes y en otros sustitución de código (desplegando todas las funciones) en tiempo de ejecución.

Y defy es algo malo porque hace más difícil encontrar bugs, así que un buen defy es cuando no hay defy
 
Alexandr Andreev:

Definir - sustitución en tiempo de compilación, por lo que __LINE__ se convierte exactamente en lo que debe ser, puede sustituir fragmento de código incompleto

Y la función es referencia de código (goto) en muchos lenguajes y en otros sustitución de código (desplegando todas las funciones) en tiempo de ejecución.

Pregunta sobre MKL. Entiendo correctamente que no hay goto en el ejecutable, excepto para los bucles. La cuestión surgió de las peculiaridades de la compilación. Estrictamente de arriba hacia abajo. Y si se declara una variable en la parte inferior del cuerpo del bucle, y se llama en las condiciones del bucle habrá una advertencia. La salida se comprueba de arriba a abajo. Y el ejecutable se genera sustituyendo funciones como una definición, no por referenciasgoto.

 
Alexandr Andreev:

Definir - sustitución en tiempo de compilación, por lo que __LINE__ se convierte exactamente en lo que debe ser, puede sustituir fragmento de código incompleto

Una función en muchos lenguajes es una referencia al código (goto), mientras que en otros se sustituye el código (desplegando todas las funciones) en tiempo de ejecución.

Entonces, ¿la sustitución sólo afecta a la velocidad de construcción en tiempo de compilación?
¿Es razonable sólo para construir grandes proyectos?
¿O el código defectuoso se ejecutará más rápido en el ejecutable?

 
Valeriy Yastremskiy:

La pregunta es en relación con MKL. Entiendo correctamente que no hay goto en el ejecutable, excepto para los bucles. La cuestión surgió de las peculiaridades de la compilación. Estrictamente de arriba hacia abajo. Y si se declara una variable en la parte inferior del cuerpo del bucle, y se llama en las condiciones del bucle habrá una advertencia. La salida se comprueba de arriba a abajo. Y el ejecutable se genera sustituyendo funciones como una definición, no por referenciasgoto.

No, mcl utilizó definitivamente el método de referencia del código en 2008.

No es obvio que ahora se utilice el desenrollado completo.

Hoy en día, escribir tu propio compilador es de 3 a 4 años en cualquier departamento de informática,

Todo puede ser bastante complicado allí - hay referencias y desdoblamiento, por lo que uno puede escribir su código como quiera.

Lo más probable es que revelen lo que puedan, pero no todo. Está claro que los operadores como for, etc. son una historia diferente.

 
Roman:

Entonces, ¿la sustitución sólo afecta a la velocidad de construcción en tiempo de compilación?
¿Es razonable sólo para construir grandes proyectos?
¿O el código defectuoso seguirá funcionando más rápido en el ejecutable?

El despliegue de las funciones habituales es por sí mismo

es decir, por ejemplo for (int i=0; i<ArraiSize(max); i++)

aquí ArraiSize(max); se expandirá y obtendrá algo así como la dirección al tamaño del array dado (si nos fijamos en el array, tiene su tamaño en una variable, y aquí obtenemos la sustitución de esta variable "dirección en memoria") es decir, no tiene sentido cambiarlo a una variable por sí mismo, en absoluto

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<tamaño; i++)

En este caso ArraiSize(max) y size tienen los mismos tiempos para determinar el valor del tamaño del array

 
Alexandr Andreev:

No, μl utilizó definitivamente el método de referencia del código en 2008.

No es obvio que ahora se utilice el desenrollado completo.

Hoy en día, escribir tu propio compilador es el tercer o cuarto año de cualquier departamento de informática,

Todo puede ser bastante complicado allí - hay referencias y desdoblamiento, por lo que uno puede escribir su código como quiera.

Lo más probable es que revelen lo que puedan, pero no todo. Está claro que los operadores como for etc. son una historia totalmente diferente.

Gracias. A juzgar por el tema en curso Errors and Bugs, la optimización es todo.... bueno, una especie de mal que conduce a la luz)))) reparación eterna si el coche va por este camino también)

 
Roman:

Entonces, ¿la sustitución sólo afecta a la velocidad de construcción en tiempo de compilación?
¿Es razonable sólo para construir grandes proyectos?
¿O el código defectuoso se ejecutará más rápido en el ejecutable?

1 - quizás sí, pero en microsegundos =)

2 - más bien lo contrario - debemos utilizar las definiciones más cortas y el mínimo.

3 - en 2008 esta afirmación sería cierta para µl4. Pero ahora la velocidad será la misma

 
Alexandr Andreev:

El despliegue de las funciones normales es una cuestión de rutina

es decir, por ejemplo for (int i=0; i<ArraiSize(max); i++)

aquí ArraiSize(max); se expandirá y obtendrá algo así como la dirección al tamaño del array dado (si miramos el array, tiene su tamaño en una variable, y aquí tenemos la sustitución en esta variable "dirección en memoria") es decir, no tiene sentido cambiarlo a una variable, en absoluto

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<tamaño; i++)

En este caso ArraiSize(max) y size tienen los mismos tiempos para determinar el valor del tamaño del array

No estoy de acuerdo con los tiempos de este bucle de muestra.
Por el contrario, se recomienda obtener el resultado en la variable de tamaño, y utilizarlo en la condición.
La razón es que en cada iteración deArraiSize(max), el bucle se desenrolla innecesariamente, ralentizando la ejecución del bucle.
Son instrucciones innecesarias en el código ensamblador.

Razón de la queja: