讲师中心 微信公众号
AI工具推荐 视频效率加速

C++享元模式与共享数据结合应用

酷婷吖_3363

酷婷吖_3363

发布时间:2025-09-16 08:49:01

|

275人浏览过

|

来源于php中文网

原创

享元模式通过共享内部状态减少内存开销,适用于文本编辑器字符格式等重复数据场景,使用工厂类和std::shared_ptr管理可共享的CharFormat对象,结合std::unordered_map实现高效查找与复用。

c++享元模式与共享数据结合应用

在C++中,享元模式(Flyweight Pattern)常用于减少大量相似对象带来的内存开销。当多个对象共享相同数据时,通过将“不变的内部状态”提取出来共享使用,可以显著提升性能和资源利用率。将享元模式与共享数据结合,尤其适用于需要频繁创建轻量级对象但包含重复信息的场景,比如文本编辑器中的字符格式、图形系统中的样式设置等。

享元模式核心思想

享元模式通过共享尽可能多的数据来支持大量细粒度对象的高效表示。它区分两种状态:

  • 内部状态(Intrinsic State):可共享,不随环境变化,通常作为参数传入方法中。
  • 外部状态(Extrinsic State):不可共享,依赖上下文,每次调用时由客户端传入。

例如,在绘制大量相似图形时,颜色、线型等可作为内部状态共享;而位置、大小等则作为外部状态传递。

结合共享数据实现方式

在C++中,常用工厂类 + 智能指针 + std::map结构管理共享的享元对象。典型做法是使用std::shared_ptr管理共享数据,确保生命周期安全,同时避免重复创建。

立即学习“C++免费学习笔记(深入)”;

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

示例:文本编辑器中字符格式的共享

<font color="green">// 字符格式(内部状态)
struct CharFormat {
    std::string font;
    int size;
    bool bold;
    bool italic;

    // 支持比较,便于查找
    bool operator==(const CharFormat& other) const {
        return font == other.font && size == other.size &&
               bold == other.bold && italic == other.italic;
    }
};

// 哈希函数,用于unordered_map
struct FormatHash {
    size_t operator()(const CharFormat& fmt) const {
        return std::hash<std::string>()(fmt.font) ^
                (fmt.size << 4) ^
                (fmt.bold << 8) ^
                (fmt.italic << 9);
    }
};

// 享元工厂
class FormatFlyweightFactory {
private:
    std::unordered_map<CharFormat, std::shared_ptr<CharFormat>, FormatHash> pool;

public:
    std::shared_ptr<CharFormat> getFormat(const CharFormat& key) {
        auto it = pool.find(key);
        if (it != pool.end()) {
            return it->second;
        }
        auto newFmt = std::make_shared<CharFormat>(key);
        pool[key] = newFmt;
        return newFmt;
    }
};

每个字符不再保存完整的格式信息,而是持有对

CharFormat
的共享引用,大量相同格式的字符共用同一份数据。

应用场景与优势

这种模式特别适合以下情况:

  • 程序需创建大量对象,且其中许多具有相同属性。
  • 内存占用成为瓶颈,对象内部状态可被有效共享。
  • 对象行为独立于其所处上下文,外部状态可动态传入。

优势包括:

  • 大幅降低内存消耗。
  • 提高对象创建效率,避免重复初始化。
  • 借助智能指针自动管理共享资源生命周期。

基本上就这些。享元模式与共享数据结合的关键在于识别可共享的部分,并设计好工厂机制来统一管理实例。C++中配合

std::shared_ptr
和哈希容器,实现简洁高效,适合性能敏感的应用场景。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

490

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

513

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

263

2025.11.27

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

120

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

100

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn