这个函数只会被调用一次吗?

4
这是我的程序的相关部分。
// constants.h
extern const std::map<std::string, int> constMap;

// constants.cpp
std::map<std::string, int> initConstMap()
{
    //stuff required to initialize constMap
} 
const std::map<std::string, int> constMap = initConstMap();

\\ main.cpp
...
for (int i = 0, n = LOTS_OF TIMES; i < n; ++i){
    doSomethingWith(constMap[i]);
}
...

我想知道,当我在主程序中使用constMap变量时,它是否会每次运行“initConstMap”函数?显然,const map是常量,因此不需要多次初始化。 (*注意,主cpp是一个人工示例,不是我的程序实际情况。我只是为了问题简化事情)。


1
你可以添加一个static全局变量并计算它被调用的次数。 - erip
5
你可以设置一个断点并调试你的程序。 - Matias Cicero
为什么不使用 Meyers 单例?这是常见的惯用法,而且更简单、更安全。 - Cheers and hth. - Alf
@Cheersandhth.-Alf认为Meyer的单例模式是一个静态变量在函数中,保证在第一次使用时以线程安全的方式被初始化一次。现在你说这样做会更简单和更安全。我无法看出这样做会更简单,所以我必须认为这样做更安全。这个const变量的初始化不是线程安全的吗? - Peter - Reinstate Monica
@PeterA.Schneider:梅耶单例模式的代码明显更简单、更短。由于它避免了静态初始化顺序混乱,因此更加安全。这种混乱在C++ FAQ中有所讨论。 - Cheers and hth. - Alf
点赞了 n = 很多次数. - Pete Becker
3个回答

3

是的,如果你正在问这个特定的代码片段,它只会被调用一次 - 实际上它不能被调用多次,因为它是 const,而 const 禁止重新定义变量。但是您可以将结构更改为 constexpr,以便在编译时完成所有操作 - 这就是您想要的。


constexpr 无法与 std::map 所需的分配一起完成。 - Jarod42

1
如果只调用一次,则该函数仅被调用一次。当调用以初始化全局变量时,它也将在main之前被调用。
但要小心,以免遇到静态初始化顺序惨剧

0

如评论中所述,您实际上可以计算initConstMap函数被调用的次数,但是根据您的代码,它只被调用了一次。

请注意,这意味着每次调用constants.cpp的相关部分时都会调用一次,因此取决于程序的其余部分,它可能会被更频繁地调用。当然,它不会从for循环中调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接