1

最初の質問:

多くの場合、ポインタを使用した関数呼び出しを介して、あるオブジェクトの参照を別のオブジェクトに渡します。例:

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    num2Ptr = numPtr; ////we copy the value (address) of the num1Ptr pointer to num2Ptr
}

私の質問は、そのようなメソッドが非常に頻繁に呼び出される場合、ポインタコピーのかなりのオーバーヘッドを期待できますか?

2番目の質問:

次のシナリオでは、渡されたnumPtrが指すメモリアドレスの値をnum2Ptrが指すメモリアドレスにコピーすることを意味しますか?はいの場合、値を渡すのと同じですか?

int num =25;
int *num1Ptr=#
int *num2Ptr=NULL;

void assinNum (int *numPtr){

    *num2Ptr = *numPtr; ////num2Ptr points to the same value in the memory pointed by numPtr argument. 
}

最初の質問の更新:

大きなオブジェクト(プリミティブではない)へのポインターの結果はどうなりますか?

4

4 に答える 4

3

そのようなメソッドが非常に頻繁に呼び出される場合、ポインタコピーのかなりのオーバーヘッドが予想されますか?

ポインタは通常、32ビットまたは64ビットの量です。したがって、ポインタをコピーするには、32ビットまたは64ビットの量をコピーするだけで済みます。これは、ほとんどのプラットフォームで非常に安価です。ただし、int直接コピーすることも非常に安価であるため、この場合、ポインタを使用してもあまりメリットはありません。

また、多くの場合、コンパイラーはこの関数をインライン化することで最適化することも指摘しておく価値があります。

渡されたnumPtrが指すメモリアドレスの値を、num2Ptrが指すメモリアドレスにコピーするという意味ですか?

理論的には、そうです。ただし、num2Ptr = NULLコードがセグメンテーション違反を引き起こす可能性があります。

それなら、値を渡すのと同じですか?

あなたが何を言っているのかわからないので、これに答える方法を知るのは難しいです!

于 2013-01-18T20:30:38.437 に答える
2

そのようなメソッドが非常に頻繁に呼び出される場合、ポインタコピーのかなりのオーバーヘッドが予想されますか?

「オーバーヘッド」とは、実行されているオプションまたはスプリアスの作業の量を、特定の目的の効果を達成するために実際に実行する必要のある作業の量と比較していることを意味します。総作業量と最小必要作業量の違いはオーバーヘッドです。この場合、ベースラインが何であるかは明確ではありません。オーバーヘッドとは何だと思いますか?あるポインタを別のポインタにコピーする操作は非常に小さく、ターゲットプラットフォームに応じて、32ビットまたは64ビットの割り当てにすぎません。このような操作は無料ではありませんが、非常に高速です。

渡されたnumPtrが指すメモリアドレスからnum2Ptrが指すメモリアドレス?

numPtrはい、表示するコードは、によって参照されるメモリ内の値を、によって参照されるメモリにコピーしますnumPtr2。もちろん、あなたの例では、ポインタはそれぞれアドレス0x00000019と0x00000000を参照しているので、読み取り可能なメモリがあることがわかっていない限り、ソース値を読み取るときにクラッシュします。そこにも書き込み可能なメモリがあることがわかっていない限り、書き込み中にクラッシュします(おそらくそうではありません)。コメント(////num2Ptr points to the same value in the memory pointed by numPtr argument.)が正しくないことに注意してください。

はいの場合、値を渡すのと同じですか?

ポインタを渡すことは、値を渡すこととは異なります。ポインタはデータへの参照であり、データの値ではありません。(もちろん、ポインター自体は値によって渡されますが、間接参照する必要があります。)ポインターは書き込み可能であるため、ポインターに書き込むことができ、呼び出し元は、ポインターが戻ったときにそのような書き込みの効果を確認できます。

于 2013-01-18T20:38:03.703 に答える
1

私の質問は、そのようなメソッドが非常に頻繁に呼び出される場合、ポインタコピーのかなりのオーバーヘッドを期待できますか?

コピー用sizeof(int*)?いいえ。ただし、関数呼び出しの場合、特に呼び出しがPLTを介して実行される場合は、かなりのオーバーヘッドが発生する可能性があります。マルチスレッド環境では、これにより間接的に他のオーバーヘッドが発生する可能性があります。

次のシナリオでは、渡されたnumPtrが指すメモリアドレスの値をnum2Ptrが指すメモリアドレスにコピーすることを意味しますか?

はい。

はいの場合、それは値を渡すことと同じですか?

いいえ。値による整数の受け渡しは、主に値による受け渡しがメモリの読み取りを伴わず、レジスタを介して行われるため、より高速です。

于 2013-01-18T20:33:04.457 に答える
1

ポインタのコピーは非常に低コストですが、ポインタのサイズが保存されているデータと同じかそれよりも大きいプリミティブデータ型にはほとんど意味がありません。

2番目の質問では、値に対処しており、値による対処と同じになります。

于 2013-01-18T20:33:18.030 に答える