我正在比较两个C文件的两种汇编形式,一种是带有优化标志(-O2),另一种是没有。
我的问题是:
为什么在优化的汇编版本中,编译器将main函数放在所有辅助函数之后,而辅助函数首先出现在原始汇编代码中。这在效率方面意味着什么?有人可以详细说明吗?
这是原始的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 */
}
答案 0 :(得分:4)
为了提高效率,约翰是完全正确的。毕竟在目标文件中编译,函数只是符号表中的条目,顺序无关紧要。
对于您的问题,为什么会显示此订单:
答案 1 :(得分:3)
在效率方面没有任何实际意义。