函数中constexpr变量的行为
Behavior of a constexpr variable inside a function
我想知道当我在函数内定义constexpr变量时内部会发生什么。程序是否存储被调用函数的constexpr变量的每个版本?
的例子:
template <class T, std::size_t M, std::size_t N>
template <std::size_t M2, std::size_t N2>
Matrix<T, M, N>::Matrix(const Matrix<T, M2, N2>& m)
{
constexpr T m_min(MATHS::min(M, M2));
constexpr T n_min(MATHS::min(N, N2));
std::size_t i(0), j(0);
for ( ; i < m_min ; ++i )
{
for ( j = 0 ; j < n_min ; ++j )
m_elts[i][j] = m.m_elts[i][j];
for ( ; j < N ; ++j )
m_elts[i][j] = MATHS::CST<T>::ZERO;
}
for ( ; i < M ; ++i )
{
for ( j = 0 ; j < N ; ++j )
m_elts[i][j] = MATHS::CST<T>::ZERO;
}
}
//m_elts is : std::array<std::array<T, N>, M> m_elts;
这将取决于优化器和示例,但通常我会说,如果变量不使用odr (松散地使用变量地址或将其绑定到引用),那么编译器很可能不需要在运行时将值存储在某个地方。
给定以下与您提供的示例大致相似的人为示例:
#include <cstdio>
#include <algorithm>
template <typename T, size_t M, size_t N>
void func1( int x1, int x2, int x3 )
{
constexpr T y1 = std::min(M,N) ;
int y2 = x2 ;
int z1 = x1 + y1 ;
int z2 = x3 + y2 ;
printf( "%d %d %dn", x1, z1, z2 ) ;
}
template <typename T, size_t M, size_t N>
void func2( int x1, int x2, int x3 )
{
constexpr int y1 = std::min(M,N) ;
int y2 = x2 ;
int z1 = x1 + y1 ;
int z2 = x3 + y2 ;
const int *p1 = &y1 ;
printf( "%d %d %d %pn", x1, z1, z2, p1 ) ;
}
int main()
{
int x = 1, y = 2, z = 3 ;
func1<int,10,20>( x, y, z ) ;
func2<int,10,20>( x, y, z ) ;
}
我们可以看到使用godbolt的实例,我们可以看到在func1
中constexpr变量y1
被替换为文字:
leal 10(%rdi), %edx #, z1
它不是odr使用的,因为我们没有获取它的地址,也没有绑定对它的引用,但在func2
中,我们确实获取了它的地址并使用它,因此它需要在运行时存在:
movl $10, 12(%rsp) #, y1
相关文章:
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在非 constexpr 函数中作为左值传递的变量上使用 'constexpr' 函数
- constexpr函数中的静态constexpr变量
- 有时可以在 constexpr 上下文中使用非 constexpr 变量?
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 静态 constexpr 成员变量初始化
- 是否使用静态 constexpr 变量 odr?
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 静态 constexpr 全局变量
- 是否可以将变体的索引作为 constexpr 变量获取?
- 奇怪的错误 C2131 与 constexpr 声明变量
- 我可以定义一个 constexpr 匿名/未命名变量吗?
- 非 constexpr 变量模板的开销是否为零?
- Constexpr变量不是编译时值
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 在 C++17 中修改 constexpr 函数中的全局变量
- 是否可以使用"if constexpr"来声明具有不同类型和init-expr的变量
- 使用 constinit 变量初始化 constexpr 变量