什么更好用,为什么?

时间:2016-03-29 07:54:37

标签: c++ refactoring

class MyClass {
    private:
        unsigned int currentTimeMS;
    public:
        void update() {
            currentTimeMS = getTimeMS();
            // ...
        }
};

class MyClass {
    public:
        void update() {
            unsigned int currentTimeMS = getTimeMS();
            // ...
        }
};

update()调用主游戏循环,所以在第二种情况下我们得到了很多分配操作(unsigned int currentTimeMS)。在第一种情况下,我们只获得一个分配并使用之前分配的变量。 哪个代码更好用,为什么?

5 个答案:

答案 0 :(得分:8)

我推荐第二个变体,因为它是无状态的,变量的范围更小。只有在您确实遇到性能问题时才使用第一个,我认为这不太可能。

如果以后不修改变量值,还应考虑将其设为const,以便在代码中表达此意图并为编译器提供其他优化选项。

答案 1 :(得分:1)

这取决于您的需求。如果currentTimeMS中仅{strong>暂时需要update(),那么请务必在那里声明。 (在您的情况下,#option2

但是如果类的实例需要它的值(即在其他方法中使用),那么你应该将它声明为一个字段(在你的情况下,<强>#选项1 )。

答案 2 :(得分:0)

在第一个示例中,您将保存此类对象的状态。在第二个中,你不是,所以currentTime将在调用即时update()时丢失。

由您自己决定需要哪一个。

答案 3 :(得分:0)

第一种情况是定义一个成员变量,第二种是局部变量。基本类的东西。私有成员变量可用于该类中的任何函数(方法)。局部变量仅在声明它的函数中可用。

答案 4 :(得分:0)

  

哪个代码更好用,为什么?

首先,引用的代码充其量只是微小的优化。除非你必须这样做,否则不要担心这些事情。

事实上,这很可能是一种不优化。有时自动变量在堆栈上分配。堆栈分配非常快(有时甚至是免费的)。没有必要担心。其他时候,编译器可能会在寄存器中放置一个小的自动变量,例如此处使用的unsigned int。没有任何分配。

将此与将变量作为类的数据成员进行比较,仅用于避免分配。访问该变量涉及通过this指针。指针取消引用具有成本,可能远远超过向指针添加偏移量。取消引用可能导致缓存未命中。更糟糕的是,每次引用变量时都可能会执行此解除引用。


也就是说,有时最好只为了避免各种成员函数中的自动变量而创建数据成员。声明为本地自动变量的大型数组可能会导致堆栈溢出。但请注意,使double big_array[2000][2000]成为MyClass的数据成员很可能会导致在某些函数中将MyClass类型的变量声明为本地自动变量。

通过将大型数组放在堆栈上而产生的问题的标准解决方案是将它们分配到堆上。这导致另一个创建数据成员以避免局部变量的地方可能是有益的。虽然堆栈分配非常快,但堆分配(例如,new)非常慢。通过使自动变量std::unique_ptr<double> big_array = std::make_unique<double>(2000*2000)成为MyClass的数据成员,可以使重复调用的成员函数受益。

请注意,以上两者均不适用于问题中的示例代码。另请注意,最后一个问题(使堆分配的变量成为数据成员以避免重复分配和解除分配)意味着代码必须通过this指针来访问该内存。在严密的代码中,我有时会被迫创建一个本地自动指针变量,例如double* local_pointer = this->some_pointer_member,以避免通过this重复遍历。