gpt4 book ai didi

c++ - 优化循环与代码复制

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:57 25 4
gpt4 key购买 nike

我的难题是如何最好地处理可以接受参数的长循环。考虑以下方法:

void HeavyLoop(byte* startingAddress, bool secondaryModification)
{
for (int i = 0; i < 10000000; i++)
{
byte* b = startingAddress + i;
*b+= 1;
if (secondaryModification) *b+= 2;
}
}

此方法将执行我想要的操作,但我在循环中使用了 10000000 个不必要的 if

如果我像这样写同样的方法:

void HeavyLoop(byte* startingAddress, bool secondaryModification)
{
if (secondaryModification)
{
for (int i = 0; i < 10000000; i++)
{
byte* b = startingAddress + i;
*b+= 1;
*b+= 2;
}
}
else
{
for (int i = 0; i < 10000000; i++)
{
byte* b = startingAddress + i;
*b+= 1;
}
}
}

我会得到相同的结果,尽管我的整个循环代码必须重复。如果我们讨论的是一个参数,这没什么大不了的,但是当您有 4 个独立参数时,我将不得不编写 16 个不同版本的循环。

在这种情况下,“正确”的解决方案是什么?如果这是一种像 Python 这样的语言,我可以动态构建一个函数来处理循环。 C++ 中有类似的东西吗?

不用说,代码只是示例,并非实际案例。请不要给出与 *b+=1 本身有关的解决方案。我是 C++ 新手,如果有我不知道的简单解决方案,请原谅我。如果有语法错误,也请原谅我,我现在手边没有编译器。

编辑:问题是处理不能不能在循环外预先计算的语句。

最佳答案

您可以将循环实现为模板;模板参数是一个编译时常量,因此优化应该在它为假时删除不需要的代码。然后,您需要一个包装器以允许根据运行时值调用正确的特化:

template <bool secondaryModification>
void HeavyLoop(byte* startingAddress)
{
for (int i = 0; i < 10000000; i++)
{
byte* b = startingAddress + i;
*b+= 1;
if (secondaryModification) *b+= 2;
}
}

void HeavyLoop(byte* startingAddress, bool secondaryModification)
{
if (secondaryModification) {
HeavyLoop<true>(startingAddress);
} else {
HeavyLoop<false>(startingAddress);
}
}

在编译期间,模板的两个版本都将被实例化(一个包含 *b+=2; ,一个不包含,也不对参数执行运行时测试);然后应将它们内联到包装函数中以生成与第二个示例完全相同的代码 - 但无需复制任何源代码。

关于c++ - 优化循环与代码复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8805521/

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