Я сравниваю две формы сборки двух файлов C, одна с флагом оптимизации (-O2), а другая без.
Мой вопрос:
Почему в оптимизированной версии сборки компилятор ставит главную функцию после всех вспомогательных функций, тогда как вспомогательные функции стоят первыми в исходном коде сборки. Что это значит с точки зрения эффективности? Может кто-нибудь уточнить, пожалуйста?
Вот оригинальный файл C. Спасибо!
// Based on a source file found in a beginner's discussion on multidimensional arrays here:
// http://www.dreamincode.net/forums/topic/71617-3d-arrays/
#include <stdio.h>
#include <string.h>
int validColor( char *str );
int mathProblem( char *str );
// 1) Asks from six 'theoretical' different users one of two questions,
// allowing only three answers for each.
// 2) Stores the response into a multidimensional array
int main( void )
{
char myArray[ 6 ][ 3 ][ 20 ]; /* Six users, three questions, and up to 19 characters per answer
(strings are '\0' terminated), though no "true" answer is that long */
int i, valid;
/* User instructions */
for( i = 0; i < 6; i++ )
{
if ( i % 2 == 0 )
{
valid = 0;
while( valid == 0 )
{
printf( "Enter your favorite color : " );
fgets( myArray[ i ][ 0 ], 20, stdin ); /* Get answer to first question */
if( myArray[ i ][ 0 ][ 0 ] == '\n' ) /* If the user just presses enter, move to next question */
break; /* Jump out of while loop */
valid = validColor( myArray [i ][ 0 ] ); /* Call function to validate answer */
}
}
if ( i % 2 == 1 )
{
valid = 0;
while( valid == 0)
{
printf( "The roots of (x - 4)^2 : " );
fgets(myArray[ i ][ 0 ], 20, stdin); /* Get answer to second question */
if(myArray[ i ][ 0 ][ 0 ] == '\n') /* If the user just presses enter, move to next question */
break; /* Jump out of while loop */
valid = mathProblem( myArray[ i ][ 0 ] ); /* Call function to validate answer */
}
}
}
return 0;
}
int validColor( char *str )
{
if( strcmp( str, "Black\n" ) == 0 )
return 1;
if( strcmp( str, "Red\n" ) == 0 )
return 1;
if( strcmp( str, "Blue\n" ) == 0 )
return 1;
return 0; /* If no match above, answer is not valid */
}
int mathProblem( char *str )
{
if ( atoi( str ) == 2 ) /* Function call for analysis purposes */
return 1;
if ( strcmp( str, "-2\n" ) == 0 )
return 1;
if ( strcmp( str, "+2\n" ) == 0 )
return 1;
return 0; /* If no match above, answer is not valid */
}