方法中的C ++静态数组

时间:2014-05-26 08:45:21

标签: c++ arrays performance function static

如果方法经常被称为

,那么可以在方法中使用静态数组来提高性能
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];
}

5 个答案:

答案 0 :(得分:2)

样本3:

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

答案 1 :(得分:1)

实际差别很小,后者基本上只是将128添加到堆栈指针。 如果您只有必须在首次运行时进行清算,则可以保存:

static char mArr[128] = {0} ;

只有在每次都需要将数组清零时才需要memset,没有什么可以使用魔法'与静态;

答案 2 :(得分:1)

版本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进行初始化(每次调用函数时)。如果您不需要内存来保持多个函数调用,请使用此方法。

答案 3 :(得分: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;
    }
}

在这种情况下,将在第一次运行时使用firstrun初始化函数,并将其保留为以下运行中的函数。

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

答案 4 :(得分:-1)

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

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

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

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

对于:

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

对于b:

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