C++ 在集合方法中赋值前检查当前值
我将从我在互联网上找到的一个应用程序的代码片段开始。它是用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 =
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_;
};