它分析變量的生命週期,並簡單地插入在正確的地方清理函數調用?它是否有任何間接費用?如何GNU C擴展__attribute __(__ cleanup__)工作?
我寫的簡單的兩段代碼比較性能,並沒有優化編譯它們。
代碼1:
#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調用。在第二種情況下,__cleanup__屬性將在main結束時調用clean_up函數。 – Rajeshkumar
[不要將'malloc'的結果放在C中](http://stackoverflow.com/q/605845/995714) –
@Rajeshkumar:清理髮生在包含塊的末尾,而不是'main'的末尾。 –