在C ++中推迟静态变量构造

时间:2016-04-29 19:02:34

标签: c++

在我们的项目中,我们使用了外部RAM。通常在调用构造函数时,它在初始化时未初始化或安全使用。出于这个原因,当需要在外部RAM中实例化类时,需要阻止构造函数运行,直到外部RAM准备好使用。这样做的最佳方式是什么?

我能想到的一个选择是为具有正确大小和对齐的对象分配一些空间,然后在此位置调​​用新的位置。

static ALTRAM union 
{
    UINT64 alignment;
    UINT8 space[sizeof(ClassName)]
}spaceHolder;
ClassName* classInstance = NULL;
...
classInstance new (&spaceHolder) ClassName();

建议的另一个选项是在将函数传递给实例的函数中将对象实例化为静态函数对象。我在这里担心的是,似乎标准允许在第一次调用函数时调用构造函数,但似乎所有编译器都不需要这样做。 See bold text from the standard

static ClassName& GetInstance()
{
    static ALTRAM ClassName instance;
    return instance;
}

该项目为Win32 VC ++和Keil for ARM编译,但只对ARM有此要求。是否有编译指示或任何其他方法来阻止构造函数被调用?

我正在寻找不需要修改类的解决方案。

更新

感谢大家的回复,非常有帮助。我得出以下结论:

  1. 架构应在应用程序运行之前初始化硬件。这个问题引发了很多关于我们团队的讨论,很可能会得到解决。
  2. 有些人更喜欢放置新方法。
  3. 对于另一种方法,C ++标准要求在第一次执行函数时调用构造函数,因此这应该是一个可靠且可移植的解决方案。

3 个答案:

答案 0 :(得分:0)

正如已经建议的那样,留出一块内存并使用新的位置:

androidTestCompile ('org.jmockit:jmockit:1.18') {
    exclude group: 'junit'
}

答案 1 :(得分:0)

如果您担心允许编译器在需要之前构建静态本地对象,您可以随时添加间接级别:

ClassName &getInstance() {
    static ClassName *instance(NULL);
    if(!instance) instance = new ClassName;
    return *instance;
}

答案 2 :(得分:0)

许多支持嵌入式系统的编译器带有一些“启动”示例代码,它在初始化C ++环境之前执行初始化。通常,此代码设置ARM堆栈寄存器和其他项。代码可能是汇编语言。您应该将内存初始化代码放在此“启动”代码中。