【问题标题】:Will this function only be called once?这个函数只会被调用一次吗?
【发布时间】:2015-12-14 14:37:19
【问题描述】:

这是我程序的相关部分

// 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 映射显然是常量,因此不需要多次初始化。 (*注意主 cpp 是一个制造的例子,它并不是我的程序在做什么。我只是为了这个问题而简化事情)。

【问题讨论】:

  • 您可以添加一个static 全局变量并计算它被调用的次数。
  • 或者你可以实际设置一个断点并调试你的程序
  • 为什么不使用 meyers 的单例,这是常见的习惯用法,而且非常简单和安全。
  • @Cheersandhth.-Alf 认为 Meyer 的单例是函数中的静态变量,保证在第一次使用时以线程安全的方式初始化一次。现在你说那会更简单,更安全。我看不出这会更简单,所以我必须假设它更安全。这个 const 变量初始化不是线程安全的吗?
  • @PeterA.Schneider:meyers 的单例代码显然更简单、更短。因为它避免了静态初始化顺序的失败,所以它也更安全。 C++ 常见问题解答中讨论了惨败。

标签: c++ dictionary stl constants


【解决方案1】:

是的,它只会被调用一次,如果你问这个特定的代码 sn-p - 实际上它不能被调用更多次,因为它是const,而const 禁止重新定义变量.但是,您可以做的是将您的结构更改为 constexpr,因此一切都在编译时完成 - 这就是您所追求的。

【讨论】:

  • constexpr 无法完成 std::map 所需的分配。
【解决方案2】:

如果你只调用一次,那么函数只会被调用一次。当调用初始化全局变量时,它也会在main 之前调用。

小心通过,以免遇到the static initialization order fiasco

【讨论】:

    【解决方案3】:

    如 cmets 中所述,您实际上可以计算 initConstMap 函数被调用了多少次,但是查看您的代码,它只被调用了一次。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 2017-06-14
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多