【发布时间】:2018-06-03 06:39:08
【问题描述】:
抱歉标题太尴尬了,但我找不到更好的。
考虑这个示例代码(除了说明问题之外没有其他目的):
#include <vector>
void FooBar(int);
void func1()
{
static std::vector<int> vec {1, 2, 3, 4};
for (auto & v : vec)
FooBar(v);
}
void func2()
{
for (auto & v : std::vector<int> {1, 2, 3, 4})
FooBar(v);
}
这个的反汇编可以找到here
在func1 中,静态vec 向量应该在启动时一劳永逸地构造。实际上上面提到的godbolt上的反汇编表明静态vec的初始化仅在func1的第一次调用时完成,而不是在启动时完成,但这不是重点。
现在考虑func2:这里的向量在for 语句中直接声明为“内联”(不确定实际是如何调用的),但当然每次调用func2 时都会构造该向量。
有没有办法在for 语句中静态声明该向量和,例如for (auto & v : static std::vector<int> { 1, 2, 3, 4}),不幸的是这不是合法的C++。
【问题讨论】:
-
也许将其包装在自定义类中?也看看这个stackoverflow.com/questions/13816850/…
-
@JakeFreeman 但这会使代码比
func1中使用的方法更麻烦。 -
除了好奇因素,第二种方法有什么好处吗?
-
请注意,在这里使用
std::vector会适得其反,因为它的全部目的是运行时可调整大小,这直接违背了您对单例/常量的渴望。所以我假设这是一些用户类的占位符,其中constexpr版本(std::array或std::initializer_list)不容易获得。 -
@MichaelWalz 如果您不想打扰大小,通常可以调用
make_array或类似的函数。