English 中文(简体)
功能中的静态变量与电离异变异
原标题:Using static variable in function vs passing variable from caller
  • 时间:2010-06-03 10:21:56
  •  标签:
  • c++

我的职责是收集不同类型的深层镜子,每秒钟就需喷洒透镜。 我现在同意:

bool isTime( Time t )
{
     return t >= now();
}

void spawner()
{
    Time t = now();
    while( 1 )
    {
         if( isTime( t ) )//is time is called in more than one place in the real function
         {
             //launchthread and recalculation of t only happens once in real function
             launchthread()
             t = now() + offset;
         }
    }
}

但我想将其改为:

bool isTime()
{
    static Time t = now();
    if( t >= now() )
    {
         t = now() + offset;
         return true;
    }
    return false;
}

void spawner()
{
     while( 1 )
     {
         if( isTime() )
             launchthread();
     }
}

我认为,第二种方式是轻视的,但我通常以同样的方式避免静态,避免全球数据;任何人对不同风格有任何想法?

最佳回答

除了我在对该问题的评论中所引述的问题外,你应避免像 plague一样trick。 第一种形式(在装饰 b后)更清洁,更容易理解。 第二种形式,即OTOH,混淆了读者,给人一种印象,即:tt >=现在()的转让在相互之间发生后立即发生,后者认识到其静态后,不得不第二次尝试 gr取算法。

而且,你永远不能重新发挥第二个功能,也不能从多个方面加以利用。

问题回答

<密码>的一个缺陷 时间t办法是固定变量的功能,通常不会重新适用(因此不会安全阅读),这可能不是你们的问题。

如果你有两个独立的<代码>spawner,并使用<代码>static Time t,那么会发生什么情况。

如果你喜欢第二种形式的话,你就能够取得非常相似的东西,但是没有静态:

bool isTime(Time &t)
{
    if( t >= now() )
    {
         t = now() + offset;
         return true;
    }
    return false;
}

void spawner()
{
    Time t = now();
    while (1)
    {
     if( isTime(t) )
          launchthread();
    }
}

第二种方式更容易阅读<代码>spawner功能。 但是,可以通过使用成员变量,即全球国家,来使之同样可读。

struct Spawner {
    time when_to_wakemeup;
    timediff step;

    Spawner( timediff astep ): when_to_wakemeup(Now()+astep),step(astep){
    }


    // this is the member-function equivalent of your "spawner" function
    void keep_spawning() {

        while(true) {
            while( Now() < when_to_wakemeup ) Wait();
            when_to_wakemeup += step;
            spawn_one();
        }
     }

     void spawn_one() {
        //... whatever you need
     }
  };

有了这样的一个班子,你可以创造一些“座椅”,而不必为你们的全球国家提供警卫:

  Spawner very_often( .5 );
  very_often.keep_spawning();

我建议使用第一个版本,因为这一版本比较可测试。 投入和产出明显可见,你可以通过向边界点燃点时值来进行边界测试。 如果你有参考全球和(或)静态数据的代码,这是不可能的。

如果你有一个能够提供校对的图书馆,它也应该提供时间。 例如,WinAPI提供功能,每X秒打电话给某个功能。 这可能是最佳解决办法。

<代码>static Time t办法掩盖了该守则其余部分的时间。 如果这是你的意图(你不需要在其他地方使用一个全球时间,而变式<>t<>t>/code>则只是要决定是否穿透,那么静态做法对我来说似乎毫无意义。

然而,如果你的方案是模拟,如果目前时间对方案的所有部分都至关重要,那么我个人就会不隐藏时间变量,并像第一部法典那样执行<条码>。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签