Можно задаться вопросом, почему бы не использовать произвольные строки в качестве названных имен области. Ответ прост: по соображениям эффективности и безопасности. Названная функциональность поддержки области имеет одно существенное отличие от других функций библиотеки, связанных с атрибутами. Стек области действия поддерживается даже при отсутствии регистрации, поэтому, если функция<foo
>имеет утверждение<BOOST_LOG_FUNCTION()
>в своем теле, это всегда замедление. Если позволить названию области действия быть произвольной строкой, замедление будет значительно больше из-за необходимости выделения памяти и копирования строки (не говоря уже о том, что будет необходимость предварительно отформатировать ее, что также сказывается на ней).
Динамическое распределение памяти также вводит проблемы безопасности исключений: утверждение<BOOST_LOG_FUNCTION()
>(и подобные ему) станет потенциальным источником исключений. Эти проблемы усложнят код пользователя, если он хочет решить проблемы с распределением памяти.
Одним из возможных альтернативных решений было бы объединение предварительно отформатированных и предварительно выделенных названий областей применения где-то, но это, безусловно, ухудшит производительность еще больше и введет проблему обнаружения, когда обновлять или освобождать объединенные строки.
Поэтому ограничение строковых букв, казалось, было оптимальным решением, которое уменьшило использование динамической памяти и обеспечило достаточную гибкость для общих потребностей.