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

2023-12-09

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

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

“事件名称1”

“事件名称2”

“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
    }
}

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

这是我尝试过的:

如何存储将被多个不同类访问的字符串常量?

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

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

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

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

您也可以使用std::string_view in the postEvent函数,避免动态分配。此步骤是可选的。如果您无法拥有字符串视图并且仍然希望避免动态分配,请参考您的实现的 SSO 最大容量并将事件名称保持在该大小以下。

还要考虑到nonstd::string_view可以作为 C++11 库提供,并且很可能是您需要的抽象。图书馆如cpp17_headers and string-view-lite仅为该目的而存在。

它看起来像这样:

constexpr auto event_name1 = "event_name1";

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在运行时以最小的开销共享全局常量? 的相关文章

随机推荐

  • 在 OSX Yosemite 上的 Emacs 中使用 LLVM 调试器

    我想知道是否可以将 LLVM 调试器与 Emacs 一起使用 例如M x gdb接口标准 提前致谢 令人惊讶的是 向 Emacs 添加 LLVM 调试器支持是有争议的 或者没有争议 取决于您的愤世嫉俗程度 2015年2月 理查德 斯托曼写道
  • 操作系统导致的 irq 延迟是多少?

    如何估计 ARM 处理器上的 irq 延迟 irq 延迟的定义是什么 中断请求 irq 延迟是中断请求从中断源传输到被服务点所需的时间 因为有不同的中断通过不同的路径来自不同的源 显然它们的延迟取决于中断的类型 您可以找到有关特定中断的延迟
  • web.config 中的 C# 命名空间

    来自 VB 背景并被迫学习 C 的我遇到了第一个障碍 在 VB 中 我可以将我想要在整个应用程序中可用的所有命名空间放入 web config 文件中 并且它将在每个代码隐藏文件中可用 而无需添加导入语句
  • 在单体 SpringBoot 应用程序中创建集成测试

    我被要求为一个非常大的 SpringBoot 项目中的一个服务创建一个集成测试 该项目产生了数十个已实现的服务 执行应用程序时 会部署所有这些服务 我想避免部署与我正在为其创建测试的服务无关的所有服务 不幸的是 我 还 没有像我希望的那样有
  • ViewBox 使 RichTextBox 失去插入符

    RichTextBox 放置在 ViewBox 内并缩放至 10 1000 的各个级别 当百分比小于 100 时 插入符号会在随机光标位置消失 我知道当视觉效果被缩小 压缩 时 它会丢失像素 有什么办法可以让我不再丢失光标吗
  • create-react-app 和节点服务器的 ECONNREFUSED 错误

    我正在使用 create react app 因此没有自定义 webpack 和节点服务器构建 MERN 应用程序 我正在使用 nodemon 重新启动后端上的更改 问题是大约一半的时间似乎我的前端尝试在 nodemon 重新启动节点服务器
  • jQuery .click() 不起作用?

    我在 html 表中生成了一组按钮 如下所示 然后我想在单击时调用该函数 each childData function key item var packPath key replace g Replace underscore with
  • 根据第一个非零将数字舍入到最接近的“nth”

    我想将 Double 舍入到小数点后最接近的非零数字 例如 x 0 002341 rounded 0 002 x 0 000048123 rounded 0 00005 对于基数 gt 0 的情况 应该这样执行 x 1 000234 rou
  • 将列表向量转换为向量向量

    我的 txt 文件中有以下数据 1 John Smith 123 Here Street 456 4567 2 Sue Jones 43 Rose Court Street 345 7867 3 Fan Yuhong 165 Happy L
  • 创建转弯导航 iPhone 应用程序

    我正在尝试构建一个像 TomTom 或 Mapquest 这样的路线导航应用程序 并且我正在寻找一些入门帮助 以获取可用选项和许可 如果有 从技术上讲 我认为通过 Core Location 在地图上绘制当前位置或地址相当容易 但我有一些更
  • null 在此代码中如何工作? [复制]

    这个问题在这里已经有答案了 null 在此代码中如何工作 为什么它不打印对象 class Test1 public void doStuff Object o System out println In Object public void
  • 使用 MongoDB / Meteor 更新数组中的特定元素

    users voted user id AQG8ECLdBRJ4jwPMG score down 想知道我将如何更新users votedfield 是一个数组对象 我需要更新一个特定的对象 我知道index该对象所在的位置 我只需要弄清楚
  • 如何正确关闭 ODP.net 连接:dispose() 或 close()?

    这是我的powershell代码 void System Reflection Assembly LoadFile C DLL Oracle ManagedDataAccess dll OracleConnexion New Object
  • nginx 未知指令“auth_jwt”

    我想在我的 nginx 上设置 jwt auth 但出现此错误 nginx emerg unknown directive auth jwt in usr local etc nginx nginx conf 我的 nginx 版本 ngi
  • 以编程方式确定 UNC 路径中的可用空间

    是否有用于从 UNC 路径确定 NAS 存储上的可用空间的编程 API 我查看了 WMI 文档 并不清楚这是否可行 如果有代码示例和相关 API 调用的参考 我们将不胜感激 在 Windows API 中 获取FreeDiskSpaceEx
  • 饼图透明度,多个饼图

    我想将两个饼图堆叠在一起 这里的想法是将其中一个变小 这样您就只能看到后面饼图的外环 我尝试使用 chartCalProgres BackColor Color Transparent chartCalProgres ChartAreas
  • android.net.wifi.WifiManager 中缺少方法

    在网站上androidjavadoc com 一个方法startScanActive被列在类中WifiManager这使得执行主动 Wi Fi 扫描成为可能 它一直在这里讨论最近也是 然而 当我尝试在 Eclipse 中使用该方法时 找不到
  • 为什么 TFontDialog 提供的字体比 Screen.Fonts 少?

    我想知道为什么 TFontDialog 提供的字体比 Screen Fonts 少 例如 Arial 字体 Comic 字体等不会在 TFontDialog 中显示 TFontDialog 给出的字体列表似乎与 WordPad 相同 而 S
  • 掌握 Node JS 多线程的替代方案

    如果我理解正确的话 Node JS 是非阻塞的 所以它不会等待数据库或其他进程的响应 而是转移到其他东西并稍后检查 而且它是单线程的 那么这一切是否意味着给定的 Node JS 进程可以充分有效地利用单个 CPU 核心 但它不会使用机器上的
  • 如何在运行时以最小的开销共享全局常量?

    我正在使用 C 11 我不允许使用像 boost 等外部库 我必须只使用 STL 我有许多事件 必须将其标识为字符串常量 我不允许使用枚举或整数或任何其他数据类型 例如 事件名称1 事件名称2 some other event name3