簡體   English   中英

在優化方面,定義帶參數和不帶參數的函數指針有什么區別

[英]In term of optimization, What is the difference between defining function pointer with argument and without argument

我知道以這種方式定義函數指針

struct handler_index {
    const char *name;
   int (*handler)();
};

允許對具有未指定(但不可變)數量和參數類型的函數使用處理程序指針。

但我想知道,與此定義相比,此定義是否會影響代碼或內存的優化或執行時間:

struct handler_index {
    const char *name;
    int (*handler)(int a, int b);
};

如果您想知道向函數指針添加更多參數是如何特別影響函數指針的 -不會。 無論參數數量如何,函數指針的大小都相同。

如果您想知道調用這樣的函數指針的效率:添加更多參數將導致生成代碼以傳遞參數。 所以,是的,這會稍微影響調用的代碼大小,並且可能會影響執行時間,具體取決於傳遞這些arg時CPU可以拉出的ILP數量。

現代調用約定通常在寄存器中傳遞一定數量的參數,因此您可能會或可能不會增加堆棧使用率。

要確切了解每次調用生成的代碼之間的區別,請仔細閱讀調用約定 (此處列出的內容太多!),並檢查從代碼生成的asm。 但是,實際上,添加更多參數(在合理范圍內)可能會產生很小的效果,以至於根本沒有關系。

正如Cory所說的,它是函數指針還是普通的基本函數並沒有什么關系[除非在常規函數被內聯的情況下,通常,函數指針通常不能-盡管這種情況足夠具體,看到編譯器實際上發現“啊,我們總是在這里調用函數X,所以讓內聯X”-通常是當函數指針是函數的參數,而不是在結構中說時)。

通常會在函數調用中添加參數,這將有所作為。 處理器將不得不將這些參數放在某個地方,即使它們進入寄存器,也可能需要額外的指令才能將值放入RIGHT寄存器。

但是,您的第一個示例非常糟糕,因為無法檢查您的代碼是否在做正確的事情。

此外,您需要一些相當麻煩的情況,以使將參數傳遞給函數的開銷花在調用函數指針上的大部分時間上-希望您的函數所做的不只是將一個數加到另一個上。

話雖如此,傳遞很多論點,尤其是“難於獲得”的論點可能真的很糟糕。 我當時在圖形芯片模擬器上工作,部分pixelhader處理單元在其中部進行調試打印,很少打印出來,但是它需要7或8個參數(除調試級別1000或其他條件外)它是)。 從各個結構中找出這些參數並將它們粘貼到堆棧上花費了很長時間,然后放置了一個“ if(debuglevel> = 1000)...”,以便僅在實際需要時才進行調用,從而使代碼該功能快40%。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM