понедельник, 3 ноября 2008 г.

Дополнение по atexit

Я протестировал возможность добавления 32 обработчиков выхода через atexit. В результате тестов я обнаружил, что i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465) позволяет мне добавить до 80 обработчиков. Тестовый код приведен ниже:

int k=0;


void exit1(){

printf("At function exit1 %d\n",k++);

}

int main (int argc, const char * argv[]) {

int i=0;

for(i=0;i<400;++i)

atexit(exit1);

for(i=0;i<100;++i)

printf(".");

    return 0;

}


На выходе получаем:

At function exit1 1

At function exit1 2

At function exit1 3

At function exit1 4

...

At function exit1 196

At function exit1 197

At function exit1 198

At function exit1 199


Если мы используем следующий код:

int k=0;


void exit1(){

printf("At function exit1 %d\n",k++);

}


void exit2(){

printf("At function exit2 %d\n",k++);

}


void exit3(){

printf("At function exit3 %d\n",k++);

}


void exit4(){

printf("At function exit4 %d\n"k++);

}


typedef void (* Func_t)(void);


int main (int argc, const char * argv[]) {

    // insert code here...

Func_t arr[4]={exit1, exit2, exit3, exit4};

    printf("Hello, World!\n");

int i=0;

int j=0;

for(j=0;j<400;++j)

for(i=0;i<4;++i)

atexit(arr[i]);

for(i=0;i<100;++i)

printf(".");

    return 0;

}


В этом случае результат еще интереснее:

...

At function exit4 1596

At function exit3 1597

At function exit2 1598

At function exit1 1599


Это говорит о том, что количество функций-обработчиков - не ограничено. Все зависит от конкретной реализации. 

Однако, согласно стандарту, надо помнить, что гарантировано вызывается только 32 обработчика.

Комментариев нет: