2012-03-08 9 views
1

コンパイラはどのように4種類の関数定義を最適化しますか?引数の受け渡しの意味で最適化が行われていますか?関数の呼び出し時にconstポインタの引数はどのように最適化されますか?

int check_collision(const SDL_Rect const *A,const SDL_Rect const *B) { ... } 

int check_collision(SDL_Rect const *A,SDL_Rect const *B) { ... } 

int check_collision(const SDL_Rect *A, SDL_Rect const *B) { ... } 

int check_collision(SDL_Rect *A, SDL_Rect *B) { ... } 

そして、それは重要な場合は、これらの引数がfuncionを呼び出すときにコピーすることinefficent可能性がある場合には機能に読み取り専用の引数を渡すのが望ましい方法だろうどう思いますか?

+0

[const-correctnessはコンパイラに最適化の余地を与えますか?](http://stackoverflow.com/questions/6313730/does-const-correctness-give-the-compiler-more-room-for最適化) – Nemo

答えて

4

constを使用すると、関数の引数をconstとして渡すかどうかにかかわらず、現代のコンパイラは、必要な最適化を適用するのに十分効率的でスマートです。

要するに

は、&ないコンパイラの最適化のために、読みやす&は、使用方法の誤りを防止するために、この場合のconstを使用し、
コンパイラはそのの世話をするのに十分なスマートです。

1

SDL_Rectがtypedefであっても、最初の3つの宣言は実質的にすべて同じであることに注意してください(constキーワードは決してtypedefに "浸透しない"ため)。

constキーワードは、異なる場所で異なる方法で動作します。この場合、check_collisionは* A(iはA [i]も、* jもBのいずれでもない)を変更したり置き換えたりしないという(取消可能な)約束をするだけです。ただし、A [i]および/またはB [i]は、基礎となるオブジェクトが変更可能で、他の関数がそれらにアクセスする方法を知っている可能性があるため、コードが呼び出す関数によって変更される可能性があります。 C99キーワード "restrict"は、これが当てはまらないことをコンパイラに指示し、最適化の機会を多く提供します。それはあなたがここで欲しいものです。

C99は、 "restrict"によって提供されるものを上回るような特定のコンパイル時最適化を可能にするために、 "static"キーワードの新しい使用法を追加します。これらは、ポインターが、サイズが少なくとも何らかの既知の値である配列の最初の要素を指している場合にのみ適用されます。 (主にベクトル化のためのものです)

@Alsに記載されているように、「何を意味するのか」という最も簡単な文章から始めて、最適化キーワードを追加するのは、プログラムが多くの時間を費やしているプログラムのいくつかの特定の部分。

関連する問題