最终二进制大小:constexpr变量vs constexpr函数

时间:2016-08-04 23:01:32

标签: c++ constexpr

首先,我已经阅读了这篇非常翔实的answer关于定义constexpr变量与constexpr函数之间的风格差异的信息。使用这两个时,我的问题与二进制文件的最终大小有关。请考虑以下代码:

// approach 1
template <typename T>
struct foo
{
  static constexpr char name[] = "mickey";
};

// approach 2
template <typename T>
struct bar
{
  static constexpr const char* getName() { return "mickey"; }
};

const char* func1() { return foo<int>::name; }
const char* func2() { return foo<double>::name; }

const char* func3() { return bar<int>::getName(); }
const char* func4() { return bar<double>::getName(); }

在此godbolt链接中查看此代码。虽然方法1返回不同的名称副本,但方法2仅为不同的T的所有不同实例返回一个副本。实际上,当我创建100个不同类型时,方法2导致相当小的二进制。想知道是否有人经历过类似的事情。

1 个答案:

答案 0 :(得分:4)

那么,这两种方法并不完全相同。 foo<T>::name使用bar<T>::getName()无法做到的事情:我可以指向它,我可以参考它。这种能力可以防止不同的foo<T>::name相同。

但是对于getName(),没有这样的问题。你得到一个prvalue - 你不能拿它的地址。不同的bar<T>::getName函数本身必须不同,但不是底层存储。