Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在集合方法中赋值前检查当前值_C++_Coding Style - Fatal编程技术网

C++ 在集合方法中赋值前检查当前值

C++ 在集合方法中赋值前检查当前值,c++,coding-style,C++,Coding Style,我将从我在互联网上找到的一个应用程序的代码片段开始。它是用C++编写的,但是这个主题可以被应用到任何编程语言: class AppSettings { public: AppSettings() {m_value = 0;} ~AppSettings(); void AppSettings::setValue(uint value) { if (m_value != value) m_value =

我将从我在互联网上找到的一个应用程序的代码片段开始。它是用C++编写的,但是这个主题可以被应用到任何编程语言:

class AppSettings
{

public:
    AppSettings() {m_value = 0;}
    ~AppSettings();

    void AppSettings::setValue(uint value)
    {
        if (m_value != value)           
            m_value = value;
    }

private:
    uint m_value;
};
在赋值之前,是否确实需要检查当前值与新值是否不同? 这仅仅是一种编程风格、效率、良好的方式还是什么

一般来说,在类的set方法中,是否需要检查新值是否与当前值不同

在赋值之前,是否确实需要检查当前值与新值是否不同?这仅仅是一种编程风格、效率、良好的方式还是什么

在我看来是这样的

当您在编写代码时混合了两种想法(“我们只在必要时更新状态”vs.“setter只是设置值”),您通常会得到这样的代码,而示例代码最终无法清楚地表达这两种想法

但是我不能说——我必须阅读你从中获取代码的文章

一般来说,在类的set方法中,是否需要检查新值是否与当前值不同

当您进行优化时,或者当您需要在代码中表达的想法是“在必要时执行更新”时,您就会这样做

考虑一下这个(人为的和人为的)代码:

在这种情况下,您有一个内部状态更新,然后是副作用(当您更改位置时阴影已更改)

因为渲染阴影的方法很慢,所以您只希望在必要时调用它

在赋值之前,是否确实需要检查当前值与新值是否不同?这仅仅是一种编程风格、效率、良好的方式还是什么

在我看来是这样的

当您在编写代码时混合了两种想法(“我们只在必要时更新状态”vs.“setter只是设置值”),您通常会得到这样的代码,而示例代码最终无法清楚地表达这两种想法

但是我不能说——我必须阅读你从中获取代码的文章

一般来说,在类的set方法中,是否需要检查新值是否与当前值不同

当您进行优化时,或者当您需要在代码中表达的想法是“在必要时执行更新”时,您就会这样做

考虑一下这个(人为的和人为的)代码:

在这种情况下,您有一个内部状态更新,然后是副作用(当您更改位置时阴影已更改)


因为渲染阴影的方法很慢,所以您只希望在必要时调用它。

这在很大程度上取决于所分配成员的类型。如果它是一个基本类型或同样轻量级的东西,那么检查很可能是一种悲观:赋值可能比条件跳转便宜得多。请记住,基本上所有现代处理器都是基于管道的,如果分支预测失败,条件跳转可能导致管道需要中止。这会降低效率

如果类型的分配成本更高,那么答案就不那么明确了。例如,复制大数据缓冲区是一项昂贵的操作。然而,平等性的比较也是如此。要决定是盲目赋值还是先比较,您需要了解所讨论类型的独特性,并评估可能发生相同值赋值的频率、它们识别的速度,以及与“盲目”复制相比,这种识别的成本有多高还请记住,如果比较表明它们的值不同,则您将同时支付两项费用:比较,然后是副本

最后,在某些情况下,检查是必要的:当任务有副作用时。例如,如果成员的类型使其在分配给时发出通知,则您很可能需要进行比较以避免虚假通知(当然,假设您不需要这些通知)


总之,没有硬性规定,但我想说的是,平均而言,只有在有充分理由的情况下,才应该包含比较。

这在很大程度上取决于被分配成员的类型。如果它是一个基本类型或同样轻量级的东西,那么检查很可能是一种悲观:赋值可能比条件跳转便宜得多。请记住,基本上所有现代处理器都是基于管道的,如果分支预测失败,条件跳转可能导致管道需要中止。这会降低效率

如果类型的分配成本更高,那么答案就不那么明确了。例如,复制大数据缓冲区是一项昂贵的操作。然而,平等性的比较也是如此。要决定是盲目赋值还是先比较,您需要了解所讨论类型的独特性,并评估可能发生相同值赋值的频率、它们识别的速度,以及与“盲目”复制相比,这种识别的成本有多高还请记住,如果比较表明它们的值不同,则您将同时支付两项费用:比较,然后是副本

最后,在某些情况下,检查是必要的:当任务有副作用时。例如,如果成员的类型使其在分配给时发出通知,则您很可能需要进行比较以避免虚假通知(当然,假设您不需要这些通知)


总之,没有硬性规定,但我想说的是,平均而言,只有在你有充分理由的情况下,才应该包括比较。

这实际上取决于你正在设置什么,我的意思是,如果你正在设置将传播变化的东西,那么这样做很重要。在这种情况下,如果更改的成本相当大(对整个阵列重新排序,在某个网络位置更新数据,重写一个大文件),并且如果程序需要实时性能,那么它是一个g
/// object in 2D space
class TwoDObject
{
    /// shift object position
    void shift_position(int x, int y)
    {
        if(x != x_ || y != y_)
        {
            x_ = x;
            y_ = y;
            render_shadows();
        }
    }

private:

    // render the shadows cast by this object (slow implementation)
    void render_shadows();

    int x_;
    int y_;
};