2012-03-30 24 views
3
  1. 値ではなく参照でintを渡すことでパフォーマンス上の利点がありますか?あなたが参照渡しする場合は4バイトのポインタを作成していますが、値渡しの場合は値の4バイトコピーを作成しているので、これを言います。だから両方とも余分な4バイトを占めていますよね?
  2. キャストを使用してintリテラルを参照渡しすることはできますか?(int *)?または、intへのポインタを渡す必要がありますか?すなわち、その中に値を返し、通過ごとのポインタ(Cで参照がない)の利点は、機能が元intを更新することができるということである参照渡しと値渡しによるintの受け渡しの利点はありますか?

    int func1(int *a){ 
        (*a)++; // edited from comment by Joachim Pileborg 
        printf("%i\n", *a); 
        return 0; 
    } 
    
    int func2(int a){ 
        a++; 
        printf("%i\n", a); 
        return 0; 
    } 
    
    int main(void){ 
        func1(&(int *)5); // an int literal passed by reference using a cast ? 
        func2(5); 
        return 0; 
    } 
    
+2

式 '* a ++'は、_pointer_を増やします。値を大きくしたい場合は '(* a)++'を使う必要があります。 –

+2

私はそれもコンパイルすると信じられない。 intリテラルのアドレスは取ることができません。 – JeremyP

答えて

8

:以下のコード例を参照してください。パフォーマンス上の利点はありません。ポインタが渡されるのは、指し示されているintがアドレス指定可能なメモリになければならないため、プログラムを遅くする可能性があるため、レジスタに入れることはできません。

&(int *)5は、あなたが思う通りではありません。 (int *)5は、値5をポインタにキャストし、メモリアドレスとして解釈します。 &はそのポインタのアドレスを与えますが、一時アドレスを取ることは違法です。おそらく意味します。

int i = 5; 
func1(&i); 
+0

私の答えよりも速く、より明確で正確です。ニース。 – brice

+0

ポインタを渡すと4バイトのポインタが作成され、値を渡すと4バイトのコピーが作成されるのは本当ですか?したがって、どちらの方法もメモリに余分な4バイトを使用しますか? –

+0

優れた答え。 – JeremyP

関連する問題