【发布时间】: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。