从0数到99 在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); } typedef int(*IntFunction)(int*_段列表); int display1SegmentPinNums[]={…管脚编号…}; int display2SegmentPinNums[]={…其他管脚号…}; //然后,我有一些功能,显示一个数字到7段显示。根据上面的类型定义,它们各自返回一个整数1,并有一个参数(int*\u SegmentList) //所有函数的数组 IntFunction DISPLAYFUNCES[10]={display_0、display_1、display_2、display_3、display_4、display_5、display_6、display_7、display_8、display_9}; //解决方案1 用于(整数十位数=0;十位数

从0数到99 在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); } typedef int(*IntFunction)(int*_段列表); int display1SegmentPinNums[]={…管脚编号…}; int display2SegmentPinNums[]={…其他管脚号…}; //然后,我有一些功能,显示一个数字到7段显示。根据上面的类型定义,它们各自返回一个整数1,并有一个参数(int*\u SegmentList) //所有函数的数组 IntFunction DISPLAYFUNCES[10]={display_0、display_1、display_2、display_3、display_4、display_5、display_6、display_7、display_8、display_9}; //解决方案1 用于(整数十位数=0;十位数,c++,performance,for-loop,C++,Performance,For Loop,编辑: 我已经包含了我的完整代码的简化版本。希望这将有助于得到更好的答案。这是为了一个Arduino项目,顺便说一句,有7段显示,并尝试制作秒表。根据评论,我选择第二个解决方案,因为它更简洁,并且说明了它的功能(与第一个不同) 另外,根据您的RAM需求,第二个解决方案更好,因为它只使用3个变量,而不是4个作为第一个变量 但第四个变量j,可能只有几个字节(取决于平台),但通常为4 无论如何,如果你想存储所有的“十”和“一”,你需要一个列表或一个向量 为了得到更好、更具体的答案,请发布您面临的更大问

编辑:
我已经包含了我的完整代码的简化版本。希望这将有助于得到更好的答案。这是为了一个Arduino项目,顺便说一句,有7段显示,并尝试制作秒表。

根据评论,我选择第二个解决方案,因为它更简洁,并且说明了它的功能(与第一个不同)

另外,根据您的RAM需求,第二个解决方案更好,因为它只使用3个变量,而不是4个作为第一个变量

但第四个变量
j
,可能只有几个字节(取决于平台),但通常为4

无论如何,如果你想存储所有的“十”和“一”,你需要一个列表或一个向量


为了得到更好、更具体的答案,请发布您面临的更大问题

解决方案1需要更少的计算,只需加法,而解决方案2需要在每次迭代中进行整数除法和模运算


另一方面,解决方案1需要一个额外的变量,这可能会导致更高的内存使用率。但是这取决于你的硬件和你的编译器优化。

任何合适的优化编译器都会基于不断的传播、循环展开和死代码消除,最终导致
十个
包含
9

现在,根据实际的循环体,而不考虑聪明的编译器优化,您可以分析代码:

  • 解决方案1:11次初始化、121次比较、110次增量、200次分配
  • 解决方案2:1初始化、101比较、100递增、200赋值、200除法运算(和除法)、100减法
然后取决于CPU架构和其他因素:

  • 如果假设所有操作都需要一个假设的CPU周期,那么解决方案1显然会获胜
  • 但在现实中,考虑到硬件优化(如缓存、分支预测等)以及模和除法的成本,它要复杂得多。因此,最好的方法当然是使用一些基准代码进行度量
编辑:关于您的代码更改


如果函数执行一些副作用(显示等),那么当然,循环体不会被优化。我所做的其余评论仍然正确,因为解决方案1和解决方案2都使用相同的参数调用附加函数的次数相同

您的问题有两个方面:一方面是健壮性和可靠性,另一方面是速度和资源效率。根据您如何定义这些,您可能无法同时改进这两个方面

对于健壮性和可靠性:无论您选择哪种解决方案,只要代码能够工作并通过单元测试,您自己编写的代码都是好的。但是,如果你不以某种方式衡量稳健性和可靠性,你将不知道它有多好,或者你可以改进它多少(你会从定义这些概念不同的人那里得到不同的意见)

例如,如果您认为可靠性在于计数不能被arduino机器上运行的其他应用程序中断或修改。然后,您应该在代码中添加对策以降低风险,并测试您的程序如何应对这种情况。 例如,一种应对措施可能是获得对资源的独占访问权,直到它完成计数。正如您所猜测的那样,这将影响解决方案的速度和资源效率


因此,我想说,在目前的情况下,回答你的问题相当困难。我希望我仍能为您提供一些进一步改进的想法。

有什么问题吗?十的增量是多少倍,一的增量是多少倍?如果是这样的话,那只是数学,不需要循环。“那么如何改进这两种方法,使其尽可能快且不占用资源?”是你80年代的学习书籍吗?你试图解决的更大问题是什么?我怀疑这是您代码中的瓶颈。在解决方案2中,更容易看到您正在从0计数到99。所以我更愿意这样做,但这取决于其他要求。我处理的是30kb左右的RAM,所以是的,资源是重要的。不是downvoter,但是:老实说,在X86-64上,这4个变量没有寄存器溢出。考虑到没有编译器优化,并且所讨论的计算机总共有32kb的RAM,你会建议哪一个?@ZodiacZubeda直觉上我会选择解决方案1(见我答案中“模”后面的链接)。并不是所有的算子在复杂度上都相等,模和除法通常更复杂,特别是