gpt4 book ai didi

c++ - 函数内 constexpr 变量的行为

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:19 25 4
gpt4 key购买 nike

我想知道当我在函数内定义一个 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-used,我会说(松散地获取变量地址或将其绑定(bind)到引用)那么编译器很可能不需要在运行时将值存储在某个地方。

鉴于以下人为设计的示例与您提供的示例大致相似:

#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 %d\n", 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 %p\n", 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 live example ,我们可以看到在 func1 中,constexpr 变量 y1 被替换为文字:

leal     10(%rdi), %edx #, z1

它不是 odr-used,因为我们既不获取它的地址也不绑定(bind)它的引用,但在 func2 中我们确实获取它的地址并使用它,因此它需要存在于运行时间:

movl    $10, 12(%rsp)   #, y1

关于c++ - 函数内 constexpr 变量的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com