gpt4 book ai didi

c - 如何实现不同情况下的切换?

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

在下面的程序中,如果最后一个条件为真,那么我们就不必检查它之前的所有条件。是否有可能在下面的程序中实现 switch case ?我必须将与此非常相似的代码转换为 Arm 程序集。

main()
{
int x;

if (x< 32768)
x<<15;
elseif(x<49152)
(x<<12)- 7;
elseif(x<53248)
(x<<11)- 13;
elseif(x<59392)
(x<<10)-27;
elseif(x<60928)
(x<<9)-61;
elseif(x<62208)
(x<<8)-139;
elseif(x<64128)
(x<<7)-225;
elseif(x<65088)
(x<<6)-414;
elseif(x<65344)
(x<<5)-801;
elseif(x<65488)
(x<<4)-1595;
elseif(x<65512)
(x<<3)-2592;
elseif(x<65524)
(x<<2)-4589;
elseif(x<65534)
(x<<1)-8586;
}

希望有人能帮助我。

最佳答案

所以首先要做的事情是:您关心性能吗?如果是这样,您是否有实际分析数据表明此代码是热点,并且没有其他内容显示在配置文件上?

我对此表示怀疑。事实上,我愿意承认你甚至没有对它进行基准测试。相反,您正在查看代码并尝试对其进行微观优化。

如果是这种情况,那么答案很简单:停止这样做。以有意义的方式编写代码,并专注于提高代码的算法效率。让编译器担心优化事情。如果性能证明不足,进行分析并重点关注分析结果。性能问题的答案几乎总是会使用:选择性能更好的算法。答案几乎永远不会是“修改if声明”。

现在,回答您的问题:A switch在这种情况下没有帮助,因为没有合理的方式来表示这个概念 x < 32768case语句,缺少为 x 的每个这样的值编写一个语句。显然这既不实际也不理智。

更重要的是,您似乎在误解下操作 switch将转化为更少的比较。在一些极少数情况下,编译器可能能够避免比较,但大多数情况下 switch将意味着尽可能多的比较 case声明。因此,如果您需要使用 switch 检查一个变量是否有 10000 个不同的可能值。 ,您将获得 10000 次比较。

就您而言,您要检查超过 10,000 个可能的值,因此简单的 if与“小于”运算符相结合的构造比 switch 更有意义并且更高效。 .

您写道“在下面的程序中,如果最后一个条件为真,那么我们就不必检查它之前的所有条件。”确实如此。您可以重写它,这样如果最后一个条件为真,您只需要进行两次比较。但随后你只需将问题翻转过来即可: if x< 32768您最终必须检查所有其他可能的值,这样您才能回到开始的地方。

一种可能的解决方案是执行二分搜索。这当然可以算是一种算法改进,但同样,如果没有硬数据表明这确实是一个热点,这将是一个相当愚蠢的做法。

底线是:编写既易于理解又易于维护和改进的正确代码,并且不用担心重新排序 if声明。 perreal 的出色回答展示了一个简单且易于理解和维护代码的好例子。

关于编写正确代码的主题,不存在 elseif 这样的东西。在 C 和 C++ 中。这引出了我的最后一点:在微优化代码之前至少尝试运行编译器。

关于c - 如何实现不同情况下的切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218227/

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