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

Final binary size: constexpr variable vs constexpr function

本文关键字:constexpr 变量 函数 二进制      更新时间:2023-10-16

首先,我读到了这个信息丰富的答案,它涉及定义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导致了一个相当小的二进制文件。想知道是否有人经历过类似的事情。

好吧,这两种方法实际上并不相同。你可以用foo<T>::name做一些你不能用bar<T>::getName()做的事情:我可以拿一个指向它的指针,也可以引用它。这种能力可以防止不同的foo<T>::name相同。

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