【问题标题】:Inline functions instead of simple macros with constant内联函数而不是带有常量的简单宏
【发布时间】:2014-08-10 11:50:38
【问题描述】:

通常在 C++ 中,您希望使用常量而不是使用 #define 定义常量,因为存在类型检查,这是一件好事。

    #define   MYCONST 10;   // NO
    const int MYCONST = 10; // OK.

这很好,但假设我想提高我的应用程序的性能;如果我仍然必须读取该常量,我可能会从 L1 到 L3 的任何缓存级别读取它(我希望是正确的),这会导致速度变慢。

将该常量定义为如下所示的简单内联函数会更好吗?

    inline int MYCONST()
    {
       return 10;
    }

当我应该期待一些改进时,我是否正确?

根据here 的整数,它似乎取决于编译器和我使用的类型。

【问题讨论】:

  • 为什么不直接实施和衡量?您可能根本不会注意到差异,因为编译器太聪明了。顺便说一句,为宏保留 ALL_UPPERCASE。
  • 有了所有这些,编译器很可能就如何从使用该常数的任何计算中获得最大性能做出正确的决定。
  • “从 L1 到 L3 的任何缓存级别读取它 [...]” - 当编译器优化时,这些常量被放入代码段(链接的答案将其解释为“烘焙”) .没有额外的阅读。
  • 好的,我明白了 不涉及缓存..谢谢

标签: c++ performance macros inline


【解决方案1】:

No and no:当你定义类似的东西时

const int MYCONST = 10;

不会从“任何缓存级别”读取该值,但编译器(至少在过去 20 年中构建的任何编译器)将发出与您使用宏完全相同的代码(或文字,这是等效的),即它将直接放在机器代码中。

因此,您的第二个建议(使用内联函数)不仅完全没有性能优势,而且会阻止常量的许多使用(如 char my_array[MYCONST]),更不用说代码缺乏可读性、浪费空间等.

只需遵循 C++ 的主要信条并使用常量,这没有什么问题 :) ...

【讨论】:

  • 谢谢马丁,我明白了。只是我从来没有在常数方面达到如此低的水平。我想要一些专家意见。
  • 更详细一点,它适用于所有数据类型吗?双精度、字符、字符串??
  • 它适用于所有 basic 数据类型(int、byte、double、float 等)。对于 char 指针(即 C 字符串),内容(字符)将被放置在数据段中,并且指针将被视为常量(这与宏相同甚至更好)。对于对象(如std::string("Hello World")),const 方法会更好:在这种情况下,宏将导致为宏的每次使用调用构造函数,而为const 对象只会被调用一次。将const 用于常量确实没有缺点...
【解决方案2】:

我认为无论如何定义const 是更好的做法,但我也怀疑许多编译器将无法正确处理诸如

char myBuffer[MYCONST()];

不发出错误消息。

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2010-12-11
    • 2012-09-07
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2021-09-04
    • 2021-10-28
    • 2016-04-27
    相关资源
    最近更新 更多