gpt4 book ai didi

c++ - constexpr 的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 05:09:06 25 4
gpt4 key购买 nike

我试图尽可能地理解 constexpr。但是,我发现了一个我无法真正解释的问题(我不理解编译器对这段代码的决定)。此代码已在 X86-64 gcc 7.2 上使用 -O3 标志编译,C++17 作为标准标志(我一直在使用 godbolt.org 进行此编译)

使用这段代码:

#include <stdlib.h>
#include <stdio.h>

template <size_t N>
class constexpr_sum_array_compile_time
{
public:
inline constexpr constexpr_sum_array_compile_time ()
{
start_arr();
sum();
}

inline constexpr void start_arr()
{
for (int i = 0; i<N; ++i)
{
m_arr[i] = i;
}
}

inline constexpr void sum()
{
m_sum = 0;

for (int i = 0; i<N; ++i)
{
m_sum += m_arr[i];
}
}

constexpr int sum_res()
{
return this->m_sum;
}

private:
int m_arr[N];
int m_sum = 0;
};

#define NUMBER (4)

int main()
{
return constexpr_sum_array_compile_time<NUMBER>().sum_res();
}

简而言之,这是一个 constexpr 类,它创建一个具有给定大小的数组,然后对具有增量值的数组求和(arr[0] = 0,arr[1] = 1,arr[2] = 2 ... arr[n] = n) 在 compile_time 上(至少那是我想要它做的)。 如果“NUMBER”定义在范围内:{ 0 <= NUM​​BER <= 4 or 8 <= NUM​​BER <= 71 }然后这个类被完全优化并且只返回一个值(如预期的那样)

但是!如果 NUMBER 在范围内:{ 5 <= NUM​​BER <= 7 或 NUMBER >= 72},编译器无法优化返回值。怎么会?这些值有什么特别之处?您可以在 godbolt.org 检查优化,它显示正在编译的原始程序集。

已解决

看来我需要创建一个包含关键字 constexpr 的变量,以便让编译器在编译时计算它。新代码是:

#include <stdlib.h>
#include <stdio.h>

template <size_t N>
class constexpr_sum_array_compile_time
{
public:
inline constexpr constexpr_sum_array_compile_time() : m_arr(), m_sum(0)
{
start_arr();
sum();
}

inline constexpr void start_arr()
{
for (int i = 0; i<N; ++i)
{
m_arr[i] = i;
}
}

inline constexpr void sum()
{
m_sum = 0;

for (int i = 0; i<N; ++i)
{
m_sum += m_arr[i];
}
}

inline constexpr int sum_res()
{
return this->m_sum;
}

private:
int m_arr[N];
int m_sum;
};

#define NUMBER (6)

int main()
{
constexpr auto res = constexpr_sum_array_compile_time<NUMBER>().sum_res();
return res;
}

现在无论我在 NUMBER 中写什么(即使是 100000),它都会显示在编译时优化和计算的值!

最佳答案

与您的预期相反,您的类不是 constexpr(并且未在 constexpr 表达式中使用)。

constexpr auto res = constexpr_sum_array_compile_time<NUMBER>().sum_res();

会显示您遇到的不同错误。

所以您在汇编中观察到的只是常规优化。

关于c++ - constexpr 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46365250/

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