在C ++中,以下哪个解决方案从0到99计数更稳健可靠,并将每个迭代存储在数十个和一个位置的变量中?如何改进任何一种方法,使其尽可能快速和非资源密集?
typedef int (*IntFunction) (int* _SegmentList);
int display1SegmentPinNums[] = {...pin numbers...};
int display2SegmentPinNums[] = {...other pin numbers...};
// Then I have some functions that display a number to 7-segment displays. They each return an integer 1 and have a parameter of (int* _SegmentList), as per the type definition above
// An array of all the functions
IntFunction displayFunctions[10] = {display_0, display_1, display_2, display_3, display_4, display_5, display_6, display_7, display_8, display_9};
// Solution 1
for (int tens = 0; tens < 10; tens++)
{
for (int ones = 0; ones < 10; ones++)
{
displayFunctions[tens](display1SegmentPinNums);
displayFunctions[ones](display2SegmentPinNums);
}
}
// Solution 2
for (int i = 0; i < 100; i++)
{
ones = (i % 10);
tens = ((i - ones) / 10);
displayFunctions[tens](display1SegmentPinNums);
displayFunctions[ones](display2SegmentPinNums);
}
编辑: 我已经包含了完整代码的简化版本。希望它有助于更好地得到答案。这是一个Arduino项目BTW,有7段显示器,并试图制作秒表。
答案 0 :(得分:5)
任何体面的优化编译器都会得到tens
和ones
最终包含9
的结果,基于常量传播,循环展开和死代码消除。
现在取决于您的真实循环体,并且没有考虑到聪明的编译器优化,您可以分析您的代码,counting type of operations:
然后它取决于CPU架构和其他因素:
修改:关于代码更改
如果功能执行一些副作用(显示等),那么当然,你的循环体不会被优化掉。我所做的其余评论仍然是正确的,因为解决方案1和解决方案2都使用相同的参数调用附加函数相同的次数。
答案 1 :(得分:2)
解决方案1需要较少的计算,只需要添加,而解决方案2需要在每次迭代中进行整数除法和模运算。
另一方面,解决方案1需要一个额外的变量,这可能会导致更高的内存使用率。但这取决于您的硬件和编译器优化。
答案 2 :(得分:1)
您的问题有两个方面:一方面是稳健性和可靠性,另一方面是速度和资源效率。根据您如何定义这些,您可能无法改善双方。
为了健壮性和可靠性:无论您选择哪种解决方案,您编写的代码本身都很好,只要它能够正常工作并且通过单元测试就可以了。但是,如果你没有以某种方式衡量稳健性和可靠性,你就不会知道它有多好或者你可以改进多少(并且你会从不同的人那里得到不同的意见)。
例如,如果您认为可靠性是指计数不能被您的arduino计算机上运行的其他应用程序中断或修改。然后,您应该在代码中添加对策以降低风险,并测试您的程序对此类情况的反应。 一种反措施的方法可以是例如在完成计数之前获得对资源的独占访问。而且你可以猜到它会影响速度和速度。解决方案的资源效率。
因此,我认为在它的当前状态中回答你的问题相当困难。我希望我仍然能够给你一些进一步发展的想法。
答案 3 :(得分:0)
根据评论我会选择第二种解决方案,因为它更简洁,并且更清楚地说明它的作用(与第一种不同)。
根据您的RAM要求,第二种解决方案更好,因为它只使用3个变量,而不是第4个变量。
但是这个第四个变量j
可能只有几个字节(取决于平台),但通常是4个。
无论如何,如果你想存储所有“十”和“一”,你需要一个列表或一个向量。
要获得更好,更具体的答案,请发布您所面临的更大图片问题!