0

0

C++享元模式优化 共享细粒度对象

P粉602998670

P粉602998670

发布时间:2025-08-20 12:35:01

|

328人浏览过

|

来源于php中文网

原创

享元模式通过共享内部状态减少对象数量,降低内存开销;C++中利用工厂和哈希容器管理共享池,结合外部状态实现高效对象复用,适用于文本、图形等大量相似对象场景。

c++享元模式优化 共享细粒度对象

在C++中,享元模式(Flyweight Pattern)用于优化性能,特别是在需要创建大量相似对象的场景下。通过共享细粒度对象,减少内存占用和对象创建开销,从而提升程序效率。这种模式特别适用于对象中存在大量可共享的“内部状态”,而仅有少量变化的“外部状态”。

享元模式的核心思想

享元模式将对象的状态划分为两类:

  • 内部状态(Intrinsic State):可以被共享,不会随环境改变,通常在享元对象创建时确定。
  • 外部状态(Extrinsic State):依赖于上下文,不可共享,由客户端在调用时传入。

通过分离这两类状态,多个对象可以共享同一个内部状态实例,避免重复创建相同内容的对象。

应用场景与优化目标

常见适用场景包括:

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

  • 文本编辑器中字符格式对象(字体、颜色等可共享)
  • 图形系统中图标或样式对象
  • 游戏中大量相同类型的敌人或道具

目标是减少内存中重复对象的数量,降低构造/析构开销,提高缓存局部性。

实现方式:享元工厂与共享池

使用工厂类管理享元对象的创建和共享,确保相同内部状态只创建一次。

Closers Copy
Closers Copy

营销专用文案机器人

下载
class CharacterStyle {
    std::string font;
    int size;
    std::string color;

public: CharacterStyle(const std::string& f, int s, const std::string& c) : font(f), size(s), color(c) {}

void display() const {
    std::cout << "Font: " << font << ", Size: " << size << ", Color: " << color << "\n";
}

// 支持比较,用于查找是否已存在相同样式
bool operator==(const CharacterStyle& other) const {
    return font == other.font && size == other.size && color == other.color;
}

};

// 用于哈希查找 struct StyleHash { size_t operator()(const CharacterStyle& s) const { return std::hash<:string>{}(s.font) ^ std::hash{}(s.size) ^ std::hash<:string>{}(s.color); } };

class StyleFlyweightFactory { std::unordered_set pool;

public: const CharacterStyle getStyle(const std::string& font, int size, const std::string& color) { CharacterStyle temp(font, size, color); auto it = pool.find(temp); if (it != pool.end()) { return &(it); // 返回已存在的引用 } else { pool.emplace(temp); auto newIt = pool.find(temp); return &(*newIt); } } };

工厂内部使用

unordered_set
管理唯一实例,避免重复创建。客户端获取的是指向共享对象的指针,节省内存。

结合外部状态使用享元对象

享元对象本身不保存位置、内容等外部状态,这些由客户端在运行时传入。

class Character {
    char value;
    const CharacterStyle* style; // 共享的内部状态
    int x, y; // 外部状态:位置

public: Character(char val, const CharacterStyle* s, int posX, int posY) : value(val), style(s), x(posX), y(posY) {}

void draw() const {
    std::cout << "Drawing '" << value << "' at (" << x << "," << y << ") with style: ";
    style->display();
}

};

多个

Character
对象可共享同一个
CharacterStyle
,仅位置和字符值不同。

基本上就这些。享元模式通过共享减少对象数量,适合处理大量细粒度对象的场景。关键在于合理划分内外状态,并用工厂管理生命周期。C++中配合哈希容器能高效实现共享池,显著降低内存开销。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

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

49

2025.08.29

C++中int的含义
C++中int的含义

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

190

2025.08.29

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

459

2024.01.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号