gpt4 book ai didi

c++ - 如何在 C++ 中保存对 Singleton 的 get_instance 调用?

转载 作者:太空狗 更新时间:2023-10-29 21:12:31 26 4
gpt4 key购买 nike

在下面的这个虚拟示例中,我想创建一个单例,我可以在其中保存在嵌入式微 Controller 上成本很高的 get_instance 调用。

#include <stdio.h>

template<class T>
class CamelBase {
public:
static T& get_instance() {
static T instance;
return instance;
}

protected:
CamelBase() {}
CamelBase(T const&) = delete;
void operator=(T const&) = delete;
};

class Camel: public CamelBase<Camel> {
public:
int answer() {
return 42;
}
};

int main(void)
{
printf("%d\n", Camel::get_instance().answer());
return Camel::get_instance().answer();
}

我们可以在这里看到https://godbolt.org/g/1ugPxx每次调用 answer 都会调用 get_instance,这很奇怪,因为编译器无论如何都会内联 answer

main:
push {r4, lr}
bl CamelBase<Camel>::get_instance()
mov r1, #42
ldr r0, .L15
bl printf
bl CamelBase<Camel>::get_instance()
pop {r4, lr}
mov r0, #42
bx lr

是否有另一种方法可以为 I2C 或 SPI 等外围设备编写这种 Singleton?

使用静态类更好吗?一个引用指针?

最佳答案

每次您编写一个函数静态变量时,都会转化为一个条件:如果它还没有被初始化,它就会被初始化。您的编译器可能无法全局优化,因此它不知道实例是否已经存在,因此调用。

您应该问自己的第一个问题:它真的是单例吗?单例模式记录了如果您有多个实例(即使在测试时),某些事情将无法恢复。是你的情况吗?如果不是,而您只想要一个通用实例,请使用静态变量(除非您需要特定的销毁顺序)。请记住,单例记录了您代码中的一个设计缺陷,而不是一个功能。

如果你真的需要一个单例,我们通常拥有的是(与上面的 Scott Meyers 单例相反)一个指向实例的静态私有(private)成员指针(默认为 nullptr)和一个显式的 if。在get_instance()如果需要填充它。您的编译器可能会或可能不会比另一个更好地优化它 - 通常它不会在同一个 fn 和 get_instance() 中检查条件两次。将被内联。

如果这没有帮助,您仍然可以为每个函数提供一个对单例的引用,比如 auto&& instance = CamelBase<Camel>::get_instance() .但是,您也可以将它作为一个函数参数,然后问题就出现了,一直到 main - 您只是在其中创建了一个实例。如果您想要按需实例,这将不起作用。

关于c++ - 如何在 C++ 中保存对 Singleton 的 get_instance 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47145810/

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