【问题标题】:What is the best way to count in every call in c++ [closed]在c ++中计算每次调用的最佳方法是什么[关闭]
【发布时间】:2021-04-17 03:21:48
【问题描述】:

我在网上冲浪,发现了在每个函数调用中计算数字的不同方法。

1。使用函子

class count_number {
private:
     int number;
public:
     count_number(): number{1} {}
     void operator()() {
          std::cout << "Number " << number++ << '\n';
     }
};
...
count_number counter;
counter();     
counter();
counter();

输出:

Number 1
Number 2
Number 3

2。使用 Lambda

他们说它们类似于函子,唯一的区别是它们的可变性。

...
// Prior to C++ 23:
auto counter = [number = 1]() mutable { std::cout << "Number " << number++ << '\n'; }; 
counter();
counter();
counter();

输出与上面完全相同。

3。使用静态变量

变量number 在每个函数调用中都保持不变。

void counter() {
     static int number = 1;
     std::cout << "Number " << number++ << '\n';
}
...
counter();
counter();
counter();

仍然输出完全相同。

问题是:

  • 这三种方式在内存效率、性能和可读性方面的优缺点是什么。
  • 您认为哪个最好,为什么?如果没有,那是什么?
  • 除了持久化数据之外,在函数中包含静态变量有什么意义?

【问题讨论】:

标签: c++


【解决方案1】:

有什么好处和坏处

    • pro:在 C++11 之前工作。命名类支持 lambda 不可用的更复杂的用例。不使用静态。
    • 缺点:大量样板。
    • pro:样板文件少于 1。不使用静态。
    • 缺点:在 C++11 之前不起作用。不如命名类灵活。
    • 专业人士:简单。在 C++11 之前工作。

    • con:使用静态,顾名思义,它不是很灵活,可能会出现问题。例如,以下用例需要多次定义相同的函数,这在情况 1. 和 2. 中是不必要的:

      count_number counter1;
      counter1();
      counter1();
      count_number counter2;
      counter2();
      counter2();
      

你认为哪一个是最好的,为什么?如果没有,那是什么?

没有,因为每个都有优点和缺点,“最佳”取决于哪些优点和缺点适用于您的特定用例和偏好。 3. 由于使用静态,问题最大。

除了持久化数据之外,在函数中包含静态变量有什么意义?

拥有静态局部变量的意义在于持久化数据。没有“旁白”。

【讨论】:

  • “Works pre-C++11”真的是一个标准吗?那是十年前的事了。
  • @ManNickG 这是对那些不能使用 C++11 的不幸灵魂的标准。
【解决方案2】:

Functor 的另外两大优势:

  • 很容易声明多个计数器并让它们单独计数,如果您愿意的话。
  • 添加其他成员函数很容易。您可以使用 counter.reset() 或 counter.get()。

如果您确信这些都不相关,请使用静态局部变量保持简单。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2015-04-30
    • 1970-01-01
    • 2012-01-16
    • 2013-01-10
    • 2010-09-13
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多