【问题标题】:Slowdown issue if C function is placed in a separate file?如果将 C 函数放在单独的文件中,会出现减速问题?
【发布时间】:2015-12-25 15:01:02
【问题描述】:

我的程序遇到了一些奇怪的减速问题,用 C 语言编写。

我有以下代码:

typedef struct {
   Uint8 r;
   Uint8 g;
   Uint8 b;
   Uint8 alpha;
} COLOUR;

COLOUR get_colour(int r, int g, int b, int alpha) {
   COLOUR colour;

   colour.r = r;
   colour.g = g;
   colour.b = b;
   colour.alpha = alpha;

   return colour;
}

然后我在我的主循环中插入这样的内容,只是为了重现我的问题:

for (i = 0; i < 640 * 480; i++) {
   blue = get_colour(0, 0, 255, 255);
   yellow = get_colour(255, 255, 0, 255);
}

这工作正常,还没有减速。

但是,如果我将函数 get_colour() 的代码移动到单独的 .C 文件中(我更喜欢将此类函数存储在库中),我会开始变慢。只是上面简单的 for 循环导致我的帧速率从 100+ fps 下降到 70 fps。

将我的函数 get_colour() 的代码移回与其余代码相同的 .C 文件可恢复正常速度。

这是什么原因造成的?

我的编译器是 MinGW 下的 GCC,如果这有什么关系的话。

非常感谢您的任何回答。

【问题讨论】:

  • 这可能是inline expansion 的问题。如果函数在同一个translation unit 中,那么编译器可能能够内联该函数,但如果该函数在另一个源文件(因此是另一个翻译单元)中,那么编译器就不能这样做。
  • 你真的需要这样的功能吗?你不能在循环之前定义const COLOUR blue = { 0, 0, 255, 255 }; 吗?
  • @KerrekSB 颜色函数只是一个例子。对不起,如果它使我的问题过于复杂或引起人们的注意。我将其包括在内,因为那是我发现我遇到的问题的地方。从那以后我发现我可以有这样的函数:int return_something() { return 0; } 并在 for 循环中多次调用它,我也会遇到同样的减速问题。但仅当函数放置在单独的 .C 文件中时。
  • @JoachimPileborg 非常感谢,我会调查的。
  • 只是为了确认 Joachim 的评论,我尝试在单独的翻译单元中使用 inline 修饰符定义您的函数,并收到错误消息:必须在同一模块中定义使用 inline 声明的函数 get_colour。

标签: c gcc mingw


【解决方案1】:

这几乎可以肯定是因为inlining 而不是。上面有评论提到在另一个文件中使用inline关键字不起作用。

您需要做的是在.h 文件中定义内联函数,并将其包含在main() 之上。不要忘记在编译期间使用-O 标志来启用inilining。

在bar.h:

typedef struct {
   Uint8 r;
   Uint8 g;
   Uint8 b;
   Uint8 alpha;
} COLOUR;

inline COLOUR get_colour(int r, int g, int b, int alpha) {
   COLOUR colour;

   colour.r = r;
   colour.g = g;
   colour.b = b;
   colour.alpha = alpha;

   return colour;
}

在foo.c:

#include "bar.h"

int main() {
    int i;
    COLOUR blue, yellow;
    for (i = 0; i < 640 * 480; i++) {
       blue = get_colour(0, 0, 255, 255);
       yellow = get_colour(255, 255, 0, 255);
    }    
}

【讨论】:

  • 非常感谢。这似乎解决了我遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
相关资源
最近更新 更多