c++ - 重复调用的函数中的静态常量与常量

标签 c++ static constants

我只是想知道如何

void test()
{
   const static int ABC = 12;
   cout << ABC;
}

不同于

void test()
{
   const int ABC = 12;
   cout << ABC;
}

如果这个函数在程序执行过程中被重复调用?我的意思是,有任何性能差异吗?或者有什么理由让你更喜欢其中一个?

最佳答案

有几件事会影响答案:

  • 首先,只要值是 const,它几乎肯定会在任何情况下被优化掉。这意味着生成的代码很可能是相同的。
  • 其次,static 成员存储在其他地方,这意味着更少的局部性,并且可能会出现缓存未命中。
  • 第三,初始化的成本取决于类型。在您的情况下,对于 int,初始化成本基本上不存在。对于更复杂的用户定义类型,它可能是巨大的。

所以答案是,如果编译器足够简单地找出它们并进行优化,它会产生的差异。在您的示例中,几乎可以肯定是这种情况。

只要变量具有易于构造且成本低廉的类型,则首选非静态以避免缓存未命中。

如果该类型的构造成本很高,您可能想使用 static

当然,最后也是最重要的:

不要相信我们的猜测。如果您担心性能,只有一种正确的做法:

  • 测量它,以验证它确实是一个问题
  • 衡量每个可能解决方案的性能
  • 选择带来最佳性能的解决方案。

关于c++ - 重复调用的函数中的静态常量与常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1315292/

相关文章:

c++ - 如何在不同文件中使用对象 vector

c++ - 在将 constexpr 添加到语言后,将变量声明为 const 是多余的吗?

c++ - 在派生类中执行成员模板类的部分类内特化是否合法

c++ - 通过 mpi 发送 c++ std::vector<bool>

Java:我如何确定初始化 block 中定义的本地类是否需要一个封闭实例来实例化?

javascript - 从 jquery 访问 css block 的属性

c++ - iterator 和 const_iterator 之间的比较是否效率低下?

c++ - 单个tcp客户端服务器程序中是否允许多个select()

c++ - 交叉转换以获得另一个被认为是糟糕设计的接口(interface)?

c# - 状态很重要的对象的最佳设计模式 - 单例或静态