當我編寫代碼時,我嘗試通過創建「模塊」來保持程序的邏輯上可分割的部分分離。來自諸如Javascript和NodeJS或Python之類的語言來實現這一點非常簡單。有了C,我已經找到了一些方法來完成這個模式,我提供了一個下面的例子。我使用靜態方法聲明與const
聲明結構來創建「模塊」來組織我的代碼。我可以讓編譯器優化結構中的函數調用嗎?
我注意到用這種技術調用方法的成本通常只是每個調用一個彙編指令。
而不是
movl -8(%rbp), %edx
movl -12(%rbp), %eax
movl %edx, %esi
movl %eax, %edi
call my_add_method
「模塊」技術將產生
movl $my_add_method, %ecx
movl -8(%rbp), %edx
movl -12(%rbp), %eax
movl %edx, %esi
movl %eax, %edi
call *%rcx
我想找到被宣佈這些模塊的方式,但有編譯後的輸出是相同的,只是調用方法由它的直接名稱。
我想知道的是:
有沒有一種方法可以讓編譯器(GCC),無論是與標誌或聲明的結構不同,優化代碼,這樣所產生的ASM是一樣?
我想這將是簡單編譯器優化的事情,如果沒有方法存在,爲什麼這種優化通常不可能? (考慮到結構都不變和靜態)
/**
* File: main.c
* Target: x86_64-linux-gnu
* Compile: gcc main.c -S -o main
*/
#include <stdio.h>
typedef struct {
int (* const add_func)(int, int);
} MY_MOD_T;
static int my_add_method(int a, int b) {
return a+b;
}
const MY_MOD_T Module = {
.add_func = my_add_method
};
int main(void) {
int a = 5;
int b = 6;
// substitute these two lines to see the different output like above
int result = Module.add_func(a, b);
//int result = my_add_method(a, b);
printf("%d + %d = %d\n", a, b, result);
return 0;
}
您能否可靠地檢測到性能差異? –
您是否嘗試過使用優化標誌(-O)?輸出將會非常不同。嘗試優化'-O0'中的asm輸出可能是徒勞無益的。 – Jahaja
不,這不是一個表現問題,只是一種好奇心。我只是認爲這對編譯器優化來說是一件簡單的事情。 – MatUtter