我知道如下所示的模板化类型不会对编译的二进制大小产生任何影响:
template<auto value>
struct ValueHolder{};
Run Code Online (Sandbox Code Playgroud)
我正在制作一个程序,它将使用很多此类包装类型,并且我认为我不想integral_constant因为这个原因而使用 s ,因为它们有一个::value成员。我可以摆脱类似的事情:
template<typename ValHolder>
struct Deducer;
template<auto value>
struct Deducer<ValueHolder<value>> {
using Output = ValueHolder<value+1>;
};
Run Code Online (Sandbox Code Playgroud)
但这肯定需要更多的工作,所以我想确保我不会白做。请注意,我们正在谈论大量这样的值(我会解释,但我不想离题太远;我可能会得到更多关于“我应该做这个项目”的评论而不是问题!) 。
所以问题是: [static] constexpr 值在编译的二进制文件中是否采用任何大小,或者这些值是否在编译时被替换,就好像它们是按字面输入的一样?我很确定它们确实会占用二进制文件的大小,但我并不肯定。
我做了一些测试来godbolt并排查看 constexpr 与非 constexpr 数组的组装,一切看起来都与我非常相似: https: //godbolt.org/z/9hecfq
int main()
{
// Non-constexpr large array
size_t arr[0xFFFF] = {};
// Constexpr large array
constexpr size_t cArr[0xFFF] = {};
// Just to avoid unused variable optimizations / warnings
cout << arr[0] << cArr[0] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)