gpt4 book ai didi

c++ - 在 C++ 中是否可以使用带有和不带有编译时间常量的相同代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:58 25 4
gpt4 key购买 nike

假设你有这样一个函数:

double do_it(int m)
{
double result = 0;

for(int i = 0; i < m; i++)
result += i;

return result;
}

如果你在编译时知道 m 你可以这样做:

template<size_t t_m>
double do_it()
{
double result = 0;

for(int i = 0; i < t_m; i++)
result += i;

return result;
}

这为优化时的循环展开提供了可能性。但是,有时您可能在编译时知道一些情况,而在运行时可能知道一些情况。或者,也许您有用户可以更改的默认值……但优化默认情况会很好。

我想知道是否有任何方法可以提供两个版本而无需基本上复制代码或使用宏?

请注意,上面是一个玩具示例来说明这一点。

最佳答案

就语言规范而言,没有通用方法可以让函数按您希望的方式工作。但这并不意味着编译器不能为您完成。

This gives a possibility for things like loop unrolling when optimizing.

你这样说好像编译器不能展开循环。

编译器可以展开模板循环的原因是由于以下因素的融合:

  1. 编译器有函数的定义。在这种情况下,提供了函数定义(它是一个模板函数,因此必须提供它的定义)。

  2. 编译器具有循环计数器的编译时值。在这种情况下,通过模板参数。

但这些因素中没有一个明确需要模板。如果编译器有一个函数的定义,并且它可以确定循环计数器的编译时值,那么它就有 100% 的展开该循环所需的信息。

它如何获取此信息无关紧要。它可以是一个 inline 函数(您必须提供定义),您可以在给定编译时常量作为参数的情况下调用该函数。它可以是一个 constexpr 函数(同样,您必须提供定义),您在给定编译时常量作为参数的情况下调用该函数。

这是实现质量的问题,而不是语言问题。如果编译时参数永远是一件事,那就是支持你不能做的事情,而不是支持优化(或者至少,不是编译器优化)。例如,您不能有一个返回 std::array 的函数,其长度由常规函数参数而不是模板参数指定。

关于c++ - 在 C++ 中是否可以使用带有和不带有编译时间常量的相同代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380614/

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