方法中的静态数组
C++ static array in method
如果方法经常被调用,可以在方法中使用静态数组来提高性能,例如
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};
}
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 静态数组的自由动态数组
- 如何在C++函数中声明静态 2D 数组?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 基于字节数组生成静态范围整数值
- 如何在C++中删除静态数组?
- 为什么 &a 和 c++ 中的静态数组相同?
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- C++访问静态 constexpr 数组
- 初始化类中的静态 const 数组 - C++
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 动态分配的数组和静态数组之间的区别
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 如何在静态函数中使用成员函数数组
- 具有大的2d数组:静态int与int