什么存储类是函数内部的静态,以及为什么



如果我使用的是单例模式(是的,我知道-它们通常很糟糕)。。。我有一个这样的实例函数:

MySingleton* Instance() {
    static MySingleton instance;
    return &instance;
}

instance是什么存储类?

我正在读大卫·R·布滕霍夫的《用POSIX线程编程》,我看到一段文字,上面写着:

大多数时候,您可能会在文件范围内,即在任何函数之外,使用外部或静态存储类来声明条件变量。如果它们被其他文件使用,则应该具有普通(外部)存储类;如果它们仅在声明变量的文件中使用,则应具有静态存储类。

既然这个静态是函数内部的,它是自动的吗?还是因为静态关键字而导致类不同?

如果我在其文件中将"instance"变量移动为静态和全局的(不在任何函数中),我还能将其引用到另一个文件吗?还是不起作用?

我认为作者将存储持续时间和链接混为一谈,尽管建议使用什么关键字是正确的。

您的函数范围变量instance具有静态存储持续时间。如果没有static关键字,它将具有自动存储持续时间。

文件作用域中的对象总是具有静态存储持续时间(好吧,或者C++11中关键字为thread_local的线程存储持续时间)。在文件范围内使用static关键字可为对象提供内部链接extern为对象提供外部链接

描述具有"静态存储类"的东西是正确的,因为static是所谓的"存储类说明符",但这并不是全部,因为文件范围中static的含义与函数范围中的含义不同。

您可以将对具有静态存储持续时间的对象的引用传递给其他翻译单元的代码。它是否具有文件作用域或函数作用域并不重要,它的链接是什么也不重要。"如果它们被其他文件使用,它们应该具有普通(外部)存储类"只是意味着,如果其他文件将通过名称引用全局,则全局需要外部链接,因为具有内部链接的全局名称在每个TU中引用不同的对象。从技术上讲,有联系的是名称,而不是对象。

instance有一个静态存储类,因为它是用static限定符限定的,如果没有它,它将是具有本地作用域的automatic变量
在文件范围中声明的静态变量具有内部链接,不能在不同的文件中使用它们
如果您想要声明一个可以跨文件使用的全局变量,那么您需要使用extern,它为变量提供外部链接。

通常在项目中使用Singleton模式,因此该项目中只使用一个实例。比如DB连接池生成器或配置。Singleton的使用方式如下:始终被调用的实例在类中必须是静态的和私有的,类的构造函数必须是私有的,getInstance函数必须是公共的。让我们看看下面:

/**
 * @author harzumanian
 *
 */
public class LogManager {
    private File file = null;
    private static LogManager logger = null;
    /**
     * 
     */
    private LogManager() {
        file = new File(Constants.PLUGIN_LOG);
    }
    public static LogManager getLogger() {
        if (logger == null) {
            logger = new LogManager();
        }
        return logger;
    }
}

相关内容

  • 没有找到相关文章

最新更新