方法中的静态数组

C++ static array in method

本文关键字:数组 静态 方法      更新时间:2023-10-16

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

static char [1024];

我想问的是,如果数组大小很小,比如128或64,那么从样本1和样本2中哪一个更有利。示例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];
}

示例3:

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

实际上差别不大,后者基本上只是在堆栈指针上加了128。如果只有必须在第一次运行时进行清除,则可以在

中保存:
static char mArr[128] = {0} ;

memset只有在每次都需要清空数组时才需要,static没有什么神奇的;

版本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初始化(每次调用该函数时)。如果您不需要在多个函数调用中持久化内存,则使用此方法。

样本2 -样本1肯定不会编译(第一个字符,然后变量名;)

无论如何,静态意味着数组被设置在内存中的固定位置,而在示例2中,数组被放在堆栈上。这不是关于优势,而是关于你需要什么。

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

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

你不需要memset -它只会在每次调用foo时清除数组。虽然这可能是一件好事,但它与静态结合起来肯定是毫无意义的,除非您这样做:

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

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

关于"static"的用法,请看这篇文章

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

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

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

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

为:

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

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