默认值作为全局常量与函数 return 值

Default value as Global const vs. Function return value

在 Bjarne Stroustrup 的《Programming Principles and Practice Using C++》一书的 8.6.2 节 Global initialization 中,建议按如下方式定义默认值(例如日历中的日期):

const Date& default_date()
{
  static const Date dd(1970,1,1);
  return dd;
}

此方法与仅具有如下全局常量相比如何?

static const Date dd(1970,1,1);

default_date 函数是用具有合适声明的外部 linkage which means it can be used from any translation unit 声明的。

全局变量具有内部链接,因此只能在其定义的翻译单元中使用。

看这里:

https://godbolt.org/z/Y6Dhbz

从纯粹的表演 POV 来看,明显的赢家是:

在头文件中声明为静态常量

static const Date dd(1970,1,1);

使用constexpr

constexpr Date dd(1970,1,1);

正在从内联方法返回默认值。

inline Date default_date()
{
  return Date(1970,1,1);
}

How does this method compare to simply having a global constant as follows?

IF方法在同一个编译单元内编译,那么基本没有区别。但是,如果 default_date 是外部的,那么您将招致一些额外的负载。就个人而言,我只推荐使用 constexpr。