gpt4 book ai didi

使用优化标志编译 C

转载 作者:太空狗 更新时间:2023-10-29 16:03:59 27 4
gpt4 key购买 nike

我正在比较两个 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 */
}

最佳答案

对于效率,John 是完全正确的。毕竟编译到目标文件中,函数只是符号表中的条目,顺序无关紧要。

关于为什么这个顺序会这样出现的问题:

  • 当不优化时,所有调用函数只是对函数的地址。编译器然后可以轻松发出目标代码按照它遇到的顺序函数的定义。
  • 优化时,编译器会替换(至少可能)所有调用它具有的小功能内联代码手头的定义。所以一般他不能发出代码当他遇到函数时,但是必须等到他最终看到所有人的声明职能。因此发射顺序是像逆线性的东西调用图的排序。

关于使用优化标志编译 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com