c ++用于10000的数组乘法的内联函数

时间:2013-12-21 00:25:32

标签: c++ arrays inline-functions

我的任务是两个程序,这是第二个程序。第一个程序不涉及计算()函数,并在程序启动和完成时对程序计时。我的电脑将显示从.523秒到.601秒的任何内容。

第二个任务是为计算创建一个内联函数,我相信我做错了因为它不是更快。我不确定我是否使计算功能正确,因为它包含显示信息,或者内联函数应仅关注乘法。无论哪种方式将数组拉出main并进入函数都不会更快。

编译器是否只是忽略它?

#include <ctime>
#include <iostream>
using namespace std;

  inline int calculation(){
  int i;
  double result[10000];

double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }


    int main() {

    time_t t1 = time(0);                  // get time now
    struct tm * now = localtime( & t1 );
    cout << "The time now is: ";
    cout  << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << endl;

    clock_t t;                        // get ticks
    t = clock();
    cout << " Also calculating ticks...\n"<<endl;

    calculation();                    // inline function

    time_t t2 = time(0);                  // get time now
    struct tm * now2 = localtime( & t2 );
    cout << "The time now is: ";
    cout << now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec << endl;
    time_t t3= t2-t1;

    cout << "This took me "<< t3 << " second(s)" << endl;  // ticks
    t = clock() - t;
    float p;
    p = (float)t/CLOCKS_PER_SEC;
    cout << "Or more accuratley, this took " << t << " clicks" 
    << " or " << p << " seconds"<<endl;

    }

3 个答案:

答案 0 :(得分:1)

  

编译器是否只是忽略它?

最有可能,是的。可能这样做有两个原因:

  • 您正在以调试模式进行编译。在调试模式下,忽略所有inline关键字以便于调试。
  • 它忽略了它,因为函数对于内联函数来说太长了,并且使用了太多的堆栈空间来安全地内联,并且只调用一次。 inline关键字是编译器 HINT ,而非强制性要求。这是程序员推荐编译器内联函数的方式,就像发布模式下的编译器经常内联函数以提高性能一样。如果它只看到负值,则不符合。

另外,在单次调用的情况下,无论是否有效,您都不太可能看到差异。 CPU上的单个本机函数调用比OS级别的单个任务切换更容易。

答案 1 :(得分:0)

您应该禁用优化以验证您所执行的操作是否有任何影响,因为编译器很可能已经自行内联函数。

此外,如果您想确切知道代码的作用,您应该使用g ++中的-s标志进行编译,并查看编译器为您的程序生成的程序集。这将消除编译器对您的程序所做的所有不确定性。

答案 2 :(得分:0)

我不会将函数内联并将数组定义为静态。例如

int calculation(){
  int i;
  static double result[10000];

static double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    static double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }