繁体   English   中英

对象与 Static 保留变量 function state

[英]Objects vs. Static Variables for retaining function state

我有一个 function 处理作为序列的数据。 因此,我需要知道当前 function 调用期间最后一次 function 调用中某些变量的值。

我目前的做法是使用 static 变量。 我的 function 是这样的:

bool processData(Object message){
    static int lastVar1 = -1;

    int curVar1 = message.var1;
    if (curVar1 > lastVar1){
        // Do something
    }

    lastVar1 = curVar1;
}

这只是代码的一小部分; 实际上,我有 10 多个 static 变量跟踪不同的事物。 我的直觉告诉我使用这么多 static 变量可能不是一个好主意,尽管我没有什么可以支持这种感觉。

我的问题:有没有更好的方法来做到这一点?

An alternative I've been looking into is using an object whose fields are lastVar1, lastVar2, etc. However, I'm not sure if keeping an object in memory would be more efficient than using static variables.

您的问题有一种纯粹是关于风格和意见的味道,尽管有些方面不是意见问题:多线程和测试。

考虑一下:

bool foo(int x) {
    static last_val = -1;
    bool result = (x == last_val);
    last_val = x;
    return result;
}

您可以从多个线程同时调用此 function 但它不会达到预期的效果。 此外,您只能通过断言它做正确的事情来测试 function:

   foo(1);
   assert( foo(1) );    // silenty assumes that the last call did the right thing

要为测试(第一行)设置先决条件,您已经必须假设foo(1)做了正确的事情,这在某种程度上违背了在第二行中测试调用的目的。

如果方法需要当前的 object 和以前的 object,只需通过两者:

bool processData(const Object& message,const Object& previous_message){

    if (message.var1 > previous_message.var1){
        // Do something
        return true;
    }   
    return false;
}

当然,这只是将跟踪上一条消息的问题转移给了调用者,尽管那是直截了当的并且不需要搞乱静态:

 Object message, old_message;
 while ( get_more( message )) {
     processData(message, old_message);
     old_message = message;
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM