gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:40 25 4
gpt4 key购买 nike

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

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

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 为 ARM 编译,但仅对 ARM 有此要求。是否有 pragma 或任何其他方法来防止调用构造函数?

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

更新

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

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

最佳答案

如果您担心允许编译器比需要的更早构造静态局部对象,您总是可以添加一个间接级别:

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

关于c++ - 在 C++ 中推迟静态变量构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com