繁体   English   中英

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

[英]Final binary size: constexpr variable vs constexpr function

首先,我已经阅读了这个非常丰富的答案,关于定义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 s相同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM