私がコードを書くとき、私はプログラムの論理的に割り切れる部分を "モジュール"を作成することによって別々に保つことを試みます。これを達成するために、NodeJSやPythonを使ったJavascriptのような言語から来るのは本当に簡単です。私は以下の例を提供したパターンでこれを達成する方法を見つけました。 const
宣言された構造体で静的メソッド宣言を使用して、コードを整理するための「モジュール」を作成します。コンパイラで構造体の関数呼び出しを最適化できますか?
このテクニックでメソッドを呼び出すコストは、通常、呼び出しごとに1つのアセンブリ命令に過ぎないことに気付きました。
代わりの
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
が生成されますと、これらのモジュールを宣言する方法ですが、コンパイルされた出力はちょうど呼び出すと同一でいますそれは即時の名前です。
私が知りたいのは次のとおりです。結果としてASMがあるように
、いずれかのフラグを持つか、異なる構造を宣言することにより、コンパイラ(gccの)を持ってする方法はあります、コードを最適化同じ?
シンプルコンパイラが最適化するものはありますか?メソッドが存在しない場合、なぜこの種の最適化は一般的に不可能ですか?一般的なケースでは
/**
* 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