Если все ваши объекты созданы с помощью какого-то класса Factory
, вы можете найти количество объектов в куче. Даже тогда вы должны иметь что-то в методе finalize()
. Конечно, это не может быть сделано для всех объектов, например. классы библиотеки jdk не могут быть изменены. Но если вы хотите найти количество экземпляров определенного класса, который вы создали, вы можете найти это.
__FUNCTION__
нестандартно, __func__
существует в C99 / C++ 11. Другие (__LINE__
и __FILE__
) очень хорошо.
Это будет всегда сообщать о правильном файле и строке (и функционировать, если Вы примете решение использовать __FUNCTION__
/ __func__
). Оптимизация является нефактором, так как это - макрорасширение времени компиляции; это будет никогда производительность эффекта всегда.
В редких случаях может быть полезно изменить строку, которая дана __LINE__
чему-то еще. Я видел, что GNU настроить делает это, чтобы некоторые тесты сообщили о соответствующих номерах строки после того, как он ввел некоторый вуду между строками, которые не появляются в файлах первоисточника. Например:
#line 100
заставит следующие строки запуститься с __LINE__
100. Можно дополнительно добавить новое имя файла
#line 100 "file.c"
, Это только редко полезно. Но если это необходимо, нет никаких альтернатив, о которых я знаю. На самом деле, вместо строки, макрос может использоваться также, который должен привести к любой из вышеупомянутых двух форм. Пользуясь библиотекой препроцессора повышения, можно увеличить текущую строку 50:
#line BOOST_PP_ADD(__LINE__, 50)
я думал, что полезно упомянуть это, так как Вы спросили об использовании __LINE__
и __FILE__
. Каждый никогда не вытаскивает достаточно неожиданностей из C++:)
Редактирование: @Jonathan Leffler обеспечивает некоторые более хорошие примеры использования в комментариях:
Питание с #line очень полезно для препроцессоров, которые хотят сохранить ошибки сообщаемыми в коде C пользователя в соответствии с исходным файлом пользователя. Yacc, Закон, и (больше дома мне) препроцессоры ESQL/C делают это.
К вашему сведению: g ++ предлагает нестандартное __ PRETTY_FUNCTION __ макрос. Пока сейчас я не знал о C99 __ func __ (благодарит Evan!). Я думаю, что все еще предпочитаю __ PRETTY_FUNCTION __, когда это доступно для дополнительного обзора класса.
пз:
static string getScopedClassMethod( string thePrettyFunction )
{
size_t index = thePrettyFunction . find( "(" );
if ( index == string::npos )
return thePrettyFunction; /* Degenerate case */
thePrettyFunction . erase( index );
index = thePrettyFunction . rfind( " " );
if ( index == string::npos )
return thePrettyFunction; /* Degenerate case */
thePrettyFunction . erase( 0, index + 1 );
return thePrettyFunction; /* The scoped class name. */
}
Лично, я отказываюсь использовать их для чего-либо кроме сообщений отладки. Я сделал это, но я пытаюсь не показать такую информацию клиентам или конечным пользователям. Мои клиенты не являются инженерами и иногда являются не компьютерным здравым смыслом. Я мог бы зарегистрировать эту информацию к консоли, но, поскольку я сказал, неохотно за исключением сборок отладки или для внутренних инструментов. Я предполагаю, что это действительно зависит от клиентской базы, которую Вы имеете, все же.