Что такое функция __tcf_0? (видно при использовании gprof и g++)

Мы используем g++ 4.2.4, и я пытаюсь отследить некоторые проблемы с производительностью в моем коде.

Я запускаю gprof для создания профиля и получаю следующую "странность" в том, что самая дорогая функция - __tcf_0:

Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
40.00      0.04     0.04        1    40.00    95.00  __tcf_0

Затем эта функция вызывает большинство моих пользовательских функций (т.е. это та, которая вызывается из main). Ближайшее объяснение, которое я нашел для этого, было здесь, но эта ссылка относится к статическим объектам и atexit, и я не думаю, что это применимо в моем случае.

Если это полезно, я использую Boost (program_options и fusion) и библиотеки HDF5.

ОБНОВЛЕНИЕ:

Команда, которую я использую при сборке:

g++  -Wreturn-type -Wunused -Winline -pg  -DLINUX -DHAS_SETENV \
    -DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15  -g -O0 \
    --param large-function-growth=300 --param inline-unit-growth=200

person Richard Corden    schedule 04.08.2009    source источник


Ответы (2)


__tcf_0, похоже, действительно является функцией, которая вызывает деструктор статических объектов и которая регистрируется для каждого статического объекта, вызываемого при выходе (принимая как должное то, что сказано на эта страница)

Теперь результат вашего gprof довольно странный, поскольку функция, которая занимает большую часть времени, занимает всего 0,04 секунды, что означает, что вся программа выполняется за 0,1 секунды. Если я не ошибаюсь, я предполагаю, что вы не правильно профилировали. Вы скомпилировали свой код с включенным профилированием?

person Cyrille Ka    schedule 04.08.2009
comment
Я добавил к вопросу команду сборки, которую мы используем. У нас довольно гибкая система сборки, и в ней используется специальная конфигурация make gprof, которую я успешно использовал в прошлом. Так что, в принципе, я думаю, что у меня есть все необходимые настройки. - person Richard Corden; 04.08.2009
comment
Оба ответа в значительной степени верны, но представитель, вероятно, более полезен для вас. - person Richard Corden; 05.05.2011

g++ генерирует функции с этим именем. Они вызывают деструктор статических объектов и регистрируются с помощью atexit() при вызове конструктора.

person AProgrammer    schedule 04.08.2009