2010-01-30 5 views
15

estoy un poco curioso sobre cómo C y C++ de datos mango que no se almacena en las variables, por ejemplo:¿Qué hace C (++) con valores que no están almacenados en variables?

int IE6_Bugs = 12345; 
int Win_Bugs = 56789; 

Sí - todo clara. IE6_Bugs tiene 123456 almacenado en su dirección de memoria específica.

Entonces ¿qué pasa ..

if (IE6_Bugs + Win_Bugs > 10000) 
{ 
    // ... 

Así C agarra los valores de las dos variables y los añade a fin de comparar el resultado con el int a la derecha.

Pero:

  • ¿Se IE6_Bugs+Win_Bugs llegan a alcanzar la RAM? ¿O el procesador compara directamente los valores a través de su propio caché?

  • O, en el proceso de compilación, ¿la declaración if anterior se convierte en algo más "comprensible" para la máquina? (Tal vez el cálculo IE6_Bugs+Win_Bugs primera y almacenarlo en alguna variable, ...)

+0

int your_Bug = suponiendo que INT_MAX es más que 32768. – MSalters

+0

Entonces Win_Bugs ha terminado INT_MAX - ¿dónde está el problema? ^^ Como habrás visto, he elegido 123456789 para los números de ejemplo. – lamas

Respuesta

18

Va a ser colocado en un registro en la CPU (suponiendo que haya alguno disponible). Un registro es una especie de RAM superrápida superrápida que está integrada en la CPU y se utiliza para almacenar resultados de operaciones intermedias.

Si se puede determinar que el valor siempre es igual a xxx, un compilador inteligente sustituirá el valor de xxx en su lugar.

que tener en cuenta que, independientemente de si se trata como una expresión o un número, (x + y frente a 10) se todavía necesidad de ser colocado en un registro de manera que la CPU puede acceder a ella y realizar una operación basado en su valor

Para obtener más información, lea en la arquitectura de la computadora.

+1

¿Qué pasa si no se ajusta al registro? – abenthy

+0

@abenthy: va a la pila, entonces ... – Macke

+1

Bueno, depende de las arquitecturas de la CPU. Algunas CPU solo pueden leer/escribir en/desde registros, y no tienen acceso a la memoria y la pila. En ese caso, algo más se desplaza de los registros a la memoria y esto se lleva a su lugar. :-) –

8

En el caso general, el generador de código codifica tales valores directamente en las instrucciones ("direccionamiento de modo inmediato") o los almacena en el segmento de datos del programa para cargarlos según sea necesario.

Una optimización conocida como "Plegado constante" calcula los valores de las expresiones constantes en tiempo de compilación. En su ejemplo particular, un compilador inteligente reconocerá que su condición siempre será cierta y evitará generar código para la prueba, por lo que los valores 12345, 56789 y 10000 pueden no estar representados en absoluto en el código máquina generado para su programa.

Es probable que su compilador tenga la opción de conservar el lenguaje de ensamblaje intermedio generado para su programa, , p., g++ -S. Aprenda un poco sobre la arquitectura de su procesador y el lenguaje ensamblador para aprender a entender e incluso hacer inferencias útiles a partir de esta salida.

4

Pone valores temporales sin nombre donde quiera que ponga variables con nombre, generalmente en una pila. Y al igual que con las variables nombradas, el compilador puede optar por colocar los valores en los registros de la CPU para acelerar las cosas. Si realmente está interesado en esto, debería echarle un vistazo a la salida del ensamblador generada por su compilador.

+0

Eso sería una buena idea, gracias – lamas

4

Bueno, un buen compilador hará propagación constante y plegado, por lo que en ese ejemplo, reemplazaría IE6_Bugs con 12345 y Win_Bugs con 56789, y luego lo convertiría en 69134. Probablemente también se doblaría 69134> 10000 a 'verdadero' y eliminar la rama por completo, todo en tiempo de compilación.

En cuanto a dónde almacenaría el resultado de la expresión si no hiciera propagación constante o plegado, ya sea una ubicación de memoria o un registro. Un registro será mucho más rápido.

2

No hay absolutamente ninguna forma de responder de manera concluyente a esta pregunta. Las otras respuestas aquí son precisas para la mayoría de las arquitecturas, pero esto no está especificado en los estándares de C/C++, que son independientes del hardware.

El orden de evaluación está definido por la norma. Cómo se manejan las cosas en la memoria no es así.

0

La manera de saber es inspeccionar el código de ensamblador generado o pasarlo por un depurador. Diferentes compiladores pueden hacerlo de diferentes maneras. También podría depender de las opciones de compilación, como "DEPURAR".

Los comentarios aquí acerca del plegado constante y la eliminación de la prueba "si" se aplicarían si las declaraciones fueran prefijadas con "const".

Cuestiones relacionadas