【发布时间】:2016-08-04 23:01:32
【问题描述】:
首先,我已经阅读了这篇内容非常丰富的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 导致了一个相当小的二进制文件。想知道有没有人经历过类似的事情。
【问题讨论】:
-
你有什么问题?您是否要求我们确认函数占用了可执行映像中的空间?嗯,是的,是的。
-
回复了下面的最佳答案。