存储用户、错误、异常消息 (c++)
Posted
技术标签:
【中文标题】存储用户、错误、异常消息 (c++)【英文标题】:storage of user, error, exception messages (c++) 【发布时间】:2009-08-06 18:53:09 【问题描述】:相当简单的问题。 我应该在哪里存储错误、异常、用户消息? 到目前为止,我总是在将要调用它的函数中声明本地字符串并且没有打扰。 例如
SomeClass::function1(...)
std::string str1("message1");
std::string str2("message2");
std::string str3("message3");
...
// some code
...
我突然意识到,由于每次都会调用构造和初始化,因此可能会非常昂贵。将它们作为静态字符串存储在类中甚至单独的模块中会更好吗? 本地化不是这里的情况。
提前致谢。
【问题讨论】:
【参考方案1】:为什么不在需要的时候使用字符串常量?
SomeClass::function1(...)
/* ... */
throw std::runtime_error("The foo blortched the baz!");
/* ... */
或者,您可以使用static const std::string
s。如果您希望将它们复制到许多其他std::string
s,这是合适的,并且您的 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
s 的副本,而您没有写时复制(或不能依赖它存在),您可能想研究一下使用boost::flyweight。
【讨论】:
大多数当前的实现不执行写时复制。它们提供的优势(性能方面)要优于使其成为线程安全的麻烦。要处理多线程环境,您必须添加锁来保护所有操作(读取和写入),这最终会导致相当大的性能损失。 警告:函数局部静态变量(如您的示例中的 str_quux)不会在程序启动时初始化,而是在包含函数的第一次执行时初始化。这会导致线程安全问题。【参考方案2】:TBH 最好只在需要时构建错误消息(即,如果出现严重错误,谁在乎你是否会减速)。如果消息总是会出现,那么最好静态定义它们以避免它们每次都会被初始化的事实。不过,一般来说,我只在调试模式下显示用户消息,因此如果您尝试进行性能构建,很容易不显示它们。然后我只在需要时才构建它们。
【讨论】:
+1 在函数顶部定义变量(正确地,IMO)在 C++ 中是不受欢迎的。在需要时定义它们。 (如果您不打算操纵消息,为什么还要创建字符串?)以上是关于存储用户、错误、异常消息 (c++)的主要内容,如果未能解决你的问题,请参考以下文章