gpt4 book ai didi

c++ - 如何在运行时以最小的开销共享全局常量?

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

我正在使用 C++11。我不允许使用 boost 等外部库。我必须只使用 STL。

我有一些事件,必须标识为字符串常量。我不允许使用枚举或整数或任何其他数据类型。例如:

"event_name1"

"event_name2"

"some_other_event_name3"

"a_different_event_name12"

然后我有一些类需要使用这些字符串,但不知道其他类的存在(它们彼此没有任何关系)。

class Panel{

void postEvent(){
SomeSingleton::postEvent("event_name");
}
}

另一个类::

class SomeClass{

SomeClass(){
SomeSingleton::listenForEvent("event_name");
}

void receiveEvent(){
//This function is triggered when "event_name" occurs.
//Do stuff
}
}

所有这些事件都是常量,用于识别正在发生的事情。

这是我尝试过的:

How to store string constants that will be accessed by a number of different classes?

那里的一些人建议我提供如何解决具体问题的具体细节,所以我创建了这个新问题。

如何将字符串存储在一个公共(public)文件中,以便所有其他使用这些字符串的类都可以引用同一个文件?

  • 我不想在我的应用程序的生命周期内浪费内存或泄漏内存(它是一个移动应用程序)
  • 编译时间对我来说不是什么大问题,因为项目不是那么大
  • 预计可能会举办 50 场不同的事件。
  • 将所有字符串保存在一个文件中,并在情况发生变化时仅编辑该文件似乎更易于维护。
  • 任何类都可以随时监听任何事件,在编译之前我不会知道

最佳答案

最简单的方法是使用 char const* 常量,因为它更易于优化并且不使用动态分配。

您还可以在 postEvent 函数中使用 std::string_view,避免动态分配。此步骤是可选的。如果您不能拥有字符串 View 并且仍想避免动态分配,请引用您实现的 SSO 最大容量并将事件名称保持在该大小以下。

还要考虑 nonstd::string_view 可以作为 C++11 库发布,很可能是您需要的抽象。图书馆如cpp17_headersstring-view-lite仅为此目的而存在。

看起来像这样:

constexpr auto event_name1 = "event_name1";

在作为静态成员的类中,它的工作方式相同:

struct Type {
static constexpr auto event_name1 = "event_name1";
};

这最多会占用可执行文件的只读静态数据空间。

关于c++ - 如何在运行时以最小的开销共享全局常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498738/

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