-4

私はこのコードを持っています:

typedef struct
{
int a[4];
} ArrStruct;

void printSizeOfArray(ArrStruct arrStruct)
{
printf("%lu\n", sizeof(arrStruct.a));
++(arrStruct.a[2]);
}

int main()
{

int it;
ArrStruct arrStruct;
printSizeOfArray(arrStruct);

for (it = 0 ; it < sizeof(arrStruct.a)/sizeof(int); ++it)
{
printf("%d, ", arrStruct .a[it]);
}

return 0;
}

この次のコードと比較して、ランタイム/メモリ パフォーマンスが良くないという人がいます。違いはなんですか?

void printSizeOfArray(int a[])

{
printf("%lu\n", sizeof(a));
++(a[2]);
}

int main()
{

int it;
int a[4] = {0};
printSizeOfArray(a);
for (it = 0 ; it < sizeof(a)/sizeof(int) ; ++it)
{
printf("%d, ", a[it]);
}
return 0;
}

2 番目のコードの方がパフォーマンスが優れているのはなぜですか?

4

3 に答える 3

1

printSizeOfArray妥当な唯一のパフォーマンス上の問題は、おそらく がArrStruct値渡しされることです。これは、関数が呼び出されたときにコピーされることを意味し、これは不要です。パラメータをポインタで渡すと、この問題はなくなります。

vaid printSizeOfArray(ArrStruct *arrStruct)
{
   printf("%lu\n", sizeof(arrStruct->a));
   ++(arrStruct->a[2]);
}

さらに、配列を取る代替printSizeOfArray関数は正しく機能しません。パラメータは最終的に として解釈され、関数内int*sizeof計算は意図したとおりに実行されません。

于 2012-11-05T16:08:50.500 に答える
1

最適化をオンにすると、2 つの間に大きな違いがあるとは思えません。しかし、なぜそのようにコーディングしたいのでしょうか。配列を含む構造体には、配列よりもどのような利点があると思いますか? 構造体にさらに何かを追加したくない場合は、配列を使用してください。

編集:

...考え直して、あなたのコードは「配列のサイズを出力する」ことですか? 2 番目のコードは完全ではありません (貼り付けエラーですか?) が、配列のサイズは関数内では明らかではありませんが、構造体とその配列のサイズは明らかです。

于 2012-11-05T15:55:05.687 に答える