如果方法经常被称为
,那么可以在方法中使用静态数组来提高性能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];
}
答案 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};
}