2009-08-06 2 views
1

Скорее простой вопрос. Где я могу хранить сообщения об ошибках, исключения, пользователя? До сих пор я всегда указывал локальные строки внутри функции, где она будет вызываться и не беспокоиться. , например.хранение пользователя, ошибка, сообщения об исключениях (C++)

SomeClass::function1(...) 
{ 
std::string str1("message1"); 
std::string str2("message2"); 
std::string str3("message3"); 
... 
// some code 
... 
} 

Внезапно я понял, что с момента инициализации строительства & называется каждый раз, и это может быть довольно дорогим. Было бы лучше хранить их как статические строки в классе или даже в отдельном модуле? Локализация здесь не здесь.

Заранее спасибо.

ответ

5

Почему бы просто не использовать постоянную строку, когда она вам нужна?

SomeClass::function1(...) 
{ 
/* ... */ 
    throw std::runtime_error("The foo blortched the baz!"); 
/* ... */ 
} 

В качестве альтернативы вы можете использовать static const std::string s. Это уместно, если вы ожидаете, чтобы скопировать их на много других std::string с, и ваша реализация C++ делает копирование при записи:

SomeClass::function1(...) 
{ 
    static const std::string str_quux("quux"); // initialized once, at program start 
    xyz.someMember = str_quux; // might not require an allocation+copy 
} 

Если вы планируете сделать много копий этих string с, и вы не имеют копию на запись (или не могут полагаться на то, что она присутствует), вам может понадобиться использовать boost::flyweight.

+0

В большинстве современных реализаций не выполняется копирование при записи. Преимущество, которое они обеспечивают (с точки зрения производительности), превосходит количество проблем, чтобы заставить его быть потокобезопасным. Чтобы иметь дело с многопоточными средами, вам нужно будет добавить блокировки для защиты всех операций (как чтения, так и записи), что в конечном итоге приведет к значительному снижению производительности. –

+0

Предупреждение. Функция local statics (например, str_quux в вашем примере) не инициализируется при запуске программы, а при первом выполнении содержащейся функции. Это вызывает проблемы безопасности потоков. –

1

TBH, вероятно, лучше всего создавать сообщения об ошибках, когда они необходимы (т. Е. Если что-то пойдет не так, как если бы вы столкнулись с замедлением). Если сообщения всегда будут отображаться, то, вероятно, лучше всего их определить, чтобы избежать того факта, что они будут инициализироваться каждый раз. В общем, хотя, я только показываю сообщения пользователя в режиме отладки, поэтому довольно легко их не показывать, если вы пытаетесь выполнить сборку производительности. Затем я создаю их только тогда, когда они нужны.

+0

+1 Определение переменных в верхней части функции (правильно, ИМО), нахмурившись в C++. Определите их, когда они понадобятся. (И если вы не намерены манипулировать сообщениями, зачем вообще создавать строки?) – sbi

Смежные вопросы