【问题标题】:Compiling C with optimization flag使用优化标志编译 C
【发布时间】:2011-06-11 00:32:45
【问题描述】:

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

【问题讨论】:

  • 为了全面披露,您使用的是哪个编译器?
  • “主函数在所有辅助函数之后”和“辅助函数在前”有什么区别?

标签: c gcc assembly optimization


【解决方案1】:

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

对于您的问题,为什么会出现此顺序:

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

【讨论】:

  • 如果有的话,也可能适得其反。如果之前有足够的代码,指令更有可能最终被分解为不同的缓存行。
  • 简而言之,这取决于编译器生成代码的顺序,与生成代码的效率无关。
【解决方案2】:

在效率方面并没有真正的区别。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2014-07-28
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多