当前位置: 首页 > 知识库问答 >
问题:

constexpr与static Const:选择哪一个?

通飞尘
2023-03-14

对于定义像下面这样的整型类型的编译时常量(在函数和类作用域),哪种语法是最好的?

static const int kMagic = 64; // (1)
constexpr int kMagic = 64;    // (2)

(1)也适用于C++98/03编译器,而(2)至少需要C++11。两者之间还有其他区别吗?在现代C++代码中,应该选择其中一个或另一个,为什么?

int main()
{
#define USE_STATIC_CONST
#ifdef USE_STATIC_CONST
  static const int kOk = 0;
  static const int kError = 1;
#else
  constexpr int kOk = 0;
  constexpr int kError = 1;
#endif
  return kOk;
}

对于静态常量情况,这是GCC6.2生成的程序集:

main::kOk:
        .zero   4
main::kError:
        .long   1
main:
        push    rbp
        mov     rbp, rsp
        mov     eax, 0
        pop     rbp
        ret

另一方面,对于constexpr,它是:

main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 0
        mov     DWORD PTR [rbp-8], 1
        mov     eax, 0
        pop     rbp
        ret

虽然在-o3中,我得到了相同的(优化的)程序集:

main:
        xor     eax, eax
        ret
#include <iostream>
using namespace std;

int main() {
    const int k1 = 10;
    constexpr int k2 = 2*k1;
    cout << k2 << '\n';
    return 0;
}

但是,doubles似乎有不同的行为。我在这里单独提出了一个问题。

共有1个答案

伏子辰
2023-03-14

只要我们讨论的是声明的编译时常量 <罢工> 标量 整数或枚举类型,使用const(类作用域中的静态const)或constexpr完全没有区别。

请注意,编译器需要支持常量表达式中的静态const int对象(使用常量初始化器声明),这意味着编译器别无选择,只能将此类对象视为编译时常量。此外,只要这些对象保持ODR未使用,它们就不需要定义,这进一步表明它们不会用作运行时值。

此外,常量初始化规则防止动态初始化本地静态const int对象,这意味着本地声明此类对象不会带来性能损失。此外,整体静态对象对静态初始化的排序问题的免疫性是该语言的一个非常重要的特性。

constexpr是最初在C++中通过带有常量初始化器的const实现的概念的扩展和概括。对于整数类型,constexprconst已经提供的功能之外没有提供任何额外的功能。constexpr只是对初始值设定项的“一致性”进行早期检查。但是,可以说constexpr是专门为此目的设计的一个特性,因此它在风格上更适合。

 类似资料:
  • 问题内容: 总览 我正在客户端(Android手机)和服务器(Windows Server)之间来回发送消息。使用基于TCP的持久连接,哪种协议将是最佳解决方案。我正在研究性能,可伸缩性,消息大小和电池寿命。消息必须按顺序到达目的地,并且不能重复。 MQTT 这似乎是更好的解决方案,但似乎很少有大量用户使用大型实现的示例。我不确定是否可以将其集成到Windows服务器中,或者是否必须运行其他应用程

  • 问题内容: 如果我只需要2/3列,而是查询而不是在select查询中提供这些列,那么关于更多/更少I / O或内存的性能是否会有所下降? 如果我确实选择了*,则可能会出现网络开销。 但是在选择操作中,数据库引擎是否总是从磁盘中提取原子元组,还是仅提取在选择操作中请求的那些列? 如果它总是拉一个元组,则I / O开销是相同的。 同时,如果它拉出一个元组,从元组中剥离请求的列可能会占用内存。 因此,在

  • 我在我的应用程序中有日期选择器,它工作得很好。但是我需要选择一周中的某一天而不是日期(即,如果我选择日期23,我需要获得像“星期五”这样的日子而不是数字)。我使用进行点击事件。 我需要一连串的日子(如星期一或星期二)..)用于上述代码中的< code>selectedDay

  • 我有以下SQL语句,它从数据库中选择公司(存储lat/lng),并显示离客户位置最近的5个位置。这是完美的工作: $query=sprintf(“选择公司名称、地址、电话、传真、联系人、电子邮件、网站、url、纬度、经度,(1.609344*3959*acos(弧度(“$center\u lat”)*cos(弧度(纬度))*cos(弧度(经度)-弧度(“$center\u lng”))sin(弧度

  • 问题内容: 从性能角度来看,哪个更好: 要么 问题答案: 您的问题的答案是:是的。 除非您的代码很慢,否则不必担心性能差异 。如果是这样,请使用探查器确定瓶颈。 从分析的角度来看: 应该更快,因为jQuery将通过它进行管道传输(如果存在),并且本机代码比非本机代码运行得更快。它还将保存在其他函数调用中。 如果计划在上链接其他功能,则更好:

  • 问题内容: 我们正在构建一个电子商务应用程序。我们正在将JAVA堆栈与Hibernate和Spring框架一起使用。与所有电子商务应用程序一样,我们需要在我们的电子商务应用程序中构建搜索功能。 因此,我们遇到了Hibernate Search 和Apache Solr 。有人可以列出两者的优缺点,以便我们为Enterprise Search选择理想的解决方案吗? 问题答案: Apache Solr