【发布时间】:2014-01-24 10:16:38
【问题描述】:
我有一个方法/函数:
void foo() {
static const std::string strSQLQuery = "SELECT ... ";
// or maybe
const std::string strSQLQuery = "SELECT ... ";
// some operations on strSQLQuery
// i.e. concatenating with WHERE, etc.:
const std::string strSQL = strSQLQuery + strWHERE;
doSthOnDataBase(strSQL);
}
(SQL只是一个例子)
-
static const只会被初始化一次,但会一直保存在内存中,直到进程结束。 -
const将在每次运行foo()时被初始化,但在{}块结束时释放内存(堆栈)。
另一方面,字符串"SELECT ... " 仍然必须在程序代码中进行硬编码。无论我们使用 1. 还是 2.
那么哪种方法更好呢?使用static const std::string 还是仅使用const std::string?
或者也许没有人回答,因为这取决于我想如何使用foo()——每秒调用 1000 次(然后我不想每次都初始化一个变量)或每月调用 1000 次(那我不在乎)。
(我已阅读问题Difference between static const char* and const char* 并特别回答https://stackoverflow.com/a/2931146/945183,但它们适用于const char*。)
【问题讨论】:
-
您似乎已经概述了每种解决方案的优缺点。提示:没有绝对更好的选择。
-
请注意,当您有这样的
static时,您的程序会锁定。 -
我会选择静态常量,因为它需要更少的内存(堆栈是一种非常昂贵的浪费)并且它基本上具有相同的效果。附带说明一下,在通常将其全局定义为结构成员的方法中定义 const 是非常罕见的......
-
@Pandrei: wat。静态字符串意味着如果在多线程上下文中使用您的代码将会爆炸。非静态线程意味着几个字节放在堆栈上,其余的放在堆上。我不知道你在说什么。 “堆栈内存浪费很昂贵”。
-
您可以使用
const char* const strSQLQuery = "SELECT ... "。