方法调用中的静态变量

static variable in method call

本文关键字:静态 变量 调用 方法      更新时间:2023-10-16

如果在方法内部创建一个局部静态变量,是每个实例初始化一次,还是每个程序初始化一次?

这在C++和Objective-C之间有区别吗?

如果你在一个方法中创建了一个局部静态变量,是每个实例初始化一次,还是每个程序初始化一次?

每个程序一次。

即使它在非静态类成员函数中,它也不与任何类实例关联;在整个程序中只有一个变量实例,只初始化一次。

这在C++和Objective-C之间有区别吗?

在C++中,它是在第一次调用函数时初始化的。在C(和Objective-C)中,它是在程序启动之前初始化的。在实践中,这没有什么区别,因为初始化在C.中不会有任何副作用

请注意,在C++中,如果您的类或方法是"模板化的",那么将为每个模板实例化创建一个自己的静态变量。例如,使用三种不同的模板参数类型会导致三个不同的静态变量。

Objective-C在这方面与C没有什么不同,因此方法中的局部静态变量在程序生命周期中只初始化一次。

还可以看看S.O.的这篇文章,它可能有助于如何在Obj-C中使用静态变量。

每个程序初始化一次。

从ObjC++到ObjC方法,它没有变化。

如果是C,它可能会有所不同——例如,如果函数是静态内联函数,则C函数可以复制静态数据。因此,您最终可能会得到冗余的静态变量。

使用C++,每个程序只需要一次。在一个方法或导出的C函数中,每个程序一次。

在C++中,每个程序最多初始化一次;当该方法第一次被执行时,初始化发生。(特别是在执行声明时。)

您根本没有方法的实例(至少不能创建更多实例)。

奇怪的是,模块链接器,每个方法都有一个副本,任何静态变量都有一份副本。