最终二进制大小:constexpr变量与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
相同。
但对于getName()
,就不存在这样的问题。你只得到一个prvalue-你不能记下它的地址。不同的bar<T>::getName
函数本身必须是不同的,但不是底层存储。
相关文章:
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- constexpr函数中的静态constexpr变量
- 有时可以在 constexpr 上下文中使用非 constexpr 变量?
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 是否使用静态 constexpr 变量 odr?
- 是否可以将变体的索引作为 constexpr 变量获取?
- 非 constexpr 变量模板的开销是否为零?
- Constexpr变量不是编译时值
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 使用 constinit 变量初始化 constexpr 变量
- 这是通过初始化 constexpr 变量来标记编译错误的合理跳转
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- is_constant_evaluated() 应该产生 constexpr 变量吗?
- 是否都是隐式内联的 constexpr 变量
- 为全局constexpr变量生成唯一值
- 错误!Constexpr变量必须通过常数表达式constexpr初始化
- 为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
- 如果Constexpr - clang vs.GCC,则非constexpr变量
- Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值