変数のライフサイクルを分析し、クリーンアップ関数呼び出しを適切な場所に挿入するだけですか?それには間接費がかかりますか?GNU Cの拡張機能__attribute __(__ cleanup__)はどのように機能しますか?
パフォーマンスを比較するための2つの簡単なコードを作成し、最適化なしでコンパイルしました。
CODE1:
#include <stdio.h>
#include <stdlib.h>
void clean_up(int **final_value)
{
free(*final_value);
}
int main(int argc, char **argv)
{
for (int i = 0; i < 10000000; i++) {
int *avar = malloc(sizeof(int));
clean_up(&avar);
}
return 0;
}
コード2:
#include <stdio.h>
#include <stdlib.h>
void clean_up(int **final_value)
{
free(*final_value);
}
int main(int argc, char **argv)
{
for (int i = 0; i < 10000000; i++) {
int *avar __attribute__ ((__cleanup__(clean_up))) = malloc(sizeof(int));
}
return 0;
}
そして、彼らのパフォーマンスは非常に似ています。
どちらの場合も、パフォーマンスは同じになります。最初のケースでは、clean_up funcはmainによって呼び出されます。 2番目のケースでは、__cleanup__属性は、メインが終了したときにclean_up関数を呼び出します。 – Rajeshkumar
[Cで 'malloc'の結果をキャストしないでください](http://stackoverflow.com/q/605845/995714) –
@Rajeshkumar:クリーンアップは' main'の最後ではなく、ブロックを含んでいます。 –