2015-12-25 26 views
4

我遇到一些奇怪的問題,增速放緩與我的程序,C語言編寫的如果將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,如果這與它有任何關係。

非常感謝您的任何答案。

+7

這可能是與[內聯展開]的問題(https://en.wikipedia.org/wiki/Inline_expansion)。如果函數在同一個[*翻譯單元*](https://en.wikipedia.org/wiki/Translation_unit_%28programming%29)中,那麼編譯器可能能夠內聯該函數,但是如果該函數在另一個函數中源文件(因此也是另一個翻譯單元),那麼編譯器不能這樣做。 –

+0

你真的需要這樣的功能嗎?你不能在你的循環之前定義'const COLOR blue = {0,0,255,255};' –

+0

@KerrekSB顏色功能就是一個例子。對不起,如果它過度複雜我的問題或從中吸引注意力。我將它列入,因爲那是我發現我遇到的問題的地方。從那時起,我發現我可以擁有這樣的函數:'int return_something(){return 0; }'並且在for循環中調用這個函數很多次,而且我會遇到相同的放緩問題。但是隻有在函數放在一個單獨的.C文件中。 – user5716859

回答

3

這幾乎肯定是因爲inlining vs不是。上面有一條評論提到在其他文件中使用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); 
    }  
} 
+0

非常感謝。這似乎解決了我遇到的問題。 – user5716859

相關問題