【问题标题】:C++ static array in method方法中的 C++ 静态数组
【发布时间】:2014-05-26 08:45:21
【问题描述】:

如果方法经常被调用,可以在方法中使用静态数组来提高性能

static char [1024];

我想问的是,如果数组大小像 128 或 64 一样小,那么样本一和样本二中哪一个更有利。 示例 1:

void foo(){
    static  mArr char[128];
    memset(mArr,0x0,128);//not sure if this line is necessary but I think its a must ,     any commends appriciated.
}

示例 2:

void foo(){
    char mArr[128];
}

【问题讨论】:

  • 而不是memset() 只初始化您的数组一次char mArr[128]{0};
  • 是的,但是当数组是静态的时,只有在第一次调用数组被创建时,对于其他调用,新数组未分配,在这种情况下它使用前一个数组数据是愚蠢的吗?如果是这种情况,我认为您的答案可能行不通。
  • static 表示数组在不同的函数调用中是持久的。因此,对于下一次调用,内存不是垃圾,而是包含上一次调用的数据。
  • “哪个更有利” - 有利为了什么?他们做完全不同的事情。前者具有静态链接,每个条目都会清除mArr,并且不是线程安全的。后者是自动的并且在进入时是不确定的。 您要解决什么问题? 性能?尽可能少地写入和读取内存。在这两者中,#2显然“表现”更好,因为它什么都不做。
  • 测量,不要猜测。 (任何潜在的节省都不会被线程安全性的损失所抵消)。

标签: c++ arrays performance function static


【解决方案1】:

示例 3:

void foo() {
    char mArr[128] = {0};
}

【讨论】:

    【解决方案2】:

    实际差别不大,后者基本上只是将 128 添加到堆栈指针。 如果您只必须在第一次运行时进行清理,则可以节省:

    static char mArr[128] = {0} ;
    

    memset 仅在每次都需要将数组清零时才需要,静态没有什么“魔法”;

    【讨论】:

    • 但是对于我的情况,每次通话都应该将数组归零,在这种情况下,你的答案仍然有效吗?
    • 如果你想每次都清零,去掉static。或者使用您自己的示例 1。您的示例 2 不会清除任何内容,并且可能会使用未初始化的内存。
    【解决方案3】:

    版本 1:

    void foo() {
      static char a[128];
      memset(a,0x0,128);
      // use a
    }
    

    上分配a 并提供在所有函数调用中持久的内存。 a 的工作方式有点像全局变量,具有全局变量的所有问题。例如,如果从多个线程调用该函数,则此版本会出现问题。


    版本 2:

    void foo() {
      char a[128] = {0};
      // use a
    }
    

    每次调用函数时在堆栈上分配a={0}0 初始化(每次调用函数时)。如果您不需要内存在多个函数调用中保持不变,请使用此选项。

    【讨论】:

      【解决方案4】:

      绝对样本 2 - 样本 1 无法编译(第一个字符,然后是变量名;)

      无论如何,静态意味着数组被设置在内存中的固定位置,而在示例 2 中,数组被放入堆栈。这与优势无关 - 与您的需求有关。

      如果你想多次调用 foo 并且你总是想使用同一个数组并且它应该在调用之间保留它的内容(没有 memset),请使用 1)。

      如果你想在这个函数中使用数组并且每次调用它时都有一个“新鲜”的数组,请使用 2)。

      您不需要 memset - 每次调用 foo 时它都会清除数组。虽然这可能是一件好事,但与静态结合绝对没有意义,除非你这样做:

      void foo()
      {
          static  mArr char[128];
          static bool firstrun = true;
          if(firstrun)
          {
              memset(mArr,0x0,128);
              firstrun = false;
          }
      }
      

      在这种情况下,firstrun 将用于在第一次运行时初始化您的函数,并在接下来的运行中保持原样。

      要使用“静态”,请查看this 文章。

      【讨论】:

        【解决方案5】:

        我会选择 Sample 1,但您可能需要重新考虑 memset。

        让我们回顾一下这些场景:

        a) 每次调用 foo() 时都需要清空数组。

        b) 你不需要在每次调用 foo() 时清空数组。

        对于一个:

        void foo()
        {
            char mArr[128] = {0};
        }
        

        对于 b:

        void foo()
        {
            static mArr[128] = {0};
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-17
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多