首页/新闻资讯/正文详情

C++享元结构文档样式应用

发布时间:2026/11/2 18:36:28 来源:云帆数科 栏目:资讯中心
C++享元结构文档样式应用
class BaseStyle {public:enum ProperyID{PROP_FONT_SIZE,PROP_PARAGRAPH_INDENT};// virtual bool createLocalStyle();virtual void setProperty(int type, void* val) 0;};using BaseStyleSp std::shared_ptrBaseStyle;class ShareData {public:ShareData(float fontSize): m_fontSize(fontSize){}size_t hash() const { return std::hashfloat()(m_fontSize);}public:float m_fontSize;};using ShareDataSp std::shared_ptrShareData;using ShareDataWp std::weak_ptrShareData;class ShareDocData {public:float paragraphIndent;};using ShareDocDataSp std::shared_ptrShareDocData;using ShareDocDataWp std::weak_ptrShareDocData;class ShareDataLRU {public:ShareDataLRU(): m_hitCount(0) {}int m_hitCount;};#include cassert#include unordered_mapclass ShareDataMergeManger{class CharHash {public:std::size_t operator()(const ShareDataSp sharedPtr) const {if(!sharedPtr)return 0;return sharedPtr-hash();}};class CharCmp {public:bool operator()(const ShareDataSp selfPtr, const ShareDataSp otherPtr) const {if(selfPtr otherPtr)return true;if(!selfPtr)return false;if(!otherPtr)return false;return selfPtr-hash() otherPtr-hash();}};public:ShareDataSp allocCharData(const ShareDataSp charData) {//if(manger.size() 20000)// clearUnUsed();return std::make_sharedShareData(*charData);}ShareDataSp addCacheCharData(const ShareDataSp data) {auto ret manger.emplace(data, ShareDataLRU());if(ret.second) { //新添加成功return ret.first-first;} else { //已存在返回旧的ret.first-second.m_hitCount;return ret.first-first;}}ShareDataSp findCharData(const ShareDataSp data) {auto shareData manger.find(data);if(shareData manger.end()) {return nullptr;}else {shareData-second.m_hitCount; //查找次数1热度上升return shareData-first;}}void removeCharData(const ShareDataSp data) {manger.erase(data);}// 内存超过指定长度自动清除未使用的区域void clearUnUsed() {for (auto iter manger.begin(); iter ! manger.end(); ) {if(1 iter-first.use_count())iter manger.erase(iter);elseiter;}}public:std::unordered_mapShareDataSp, ShareDataLRU, CharHash, CharCmp manger;};using ShareDataMergeMangerSp std::shared_ptrShareDataMergeManger;using ShareDataMergeMangerWp std::weak_ptrShareDataMergeManger;class LocalStyle : public BaseStyle {public:LocalStyle(ShareDataSp charData, ShareDocDataSp docData, const ShareDataMergeMangerSp shareDataMergeManger):m_charData(shareDataMergeManger-addCacheCharData(charData)), m_docData(docData), m_shareDataMergeManger(shareDataMergeManger){}// ~LocalStyle() {// if(m_shareDataMergeManger.expired()) {// return;// }// auto allocManger m_shareDataMergeManger.lock();// if(!allocManger)// return;// if(2 m_charData.use_count())// allocManger-removeCharData(m_charData);// }void setFontSize(float size) {m_charData-m_fontSize size;}float fontSize() const {return m_charData-m_fontSize;}private:void setProperty(int type, void* val) override {if(PROP_FONT_SIZE type) {auto newVal *(float*)val;auto useCout m_charData.use_count();if(fontSize() newVal)return;if(useCout 2 || useCout 1) { //自己独占或与内存管理类共享数据removeCache(); //更新hash需先移除} else {detach(); //创建副本}setFontSize(newVal);// 改值merge(); //缓存更新}}void removeCache() {auto allocManger shareMemoryManger();if(!allocManger)return;allocManger-removeCharData(m_charData); //先删除key值hash不跟随联动暂无法解决性能损耗}void detach() {auto allocManger shareMemoryManger();if(!allocManger)return;m_charData allocManger-allocCharData(m_charData);}bool merge() {auto allocManger shareMemoryManger();if(!allocManger)return false;auto cacheCharData allocManger-addCacheCharData(m_charData); //新数据加入if(cacheCharData ! m_charData) {m_charData cacheCharData;return true;} else {return false;}}private:inline ShareDataMergeMangerSp shareMemoryManger() const {if(m_shareDataMergeManger.expired())return nullptr;return m_shareDataMergeManger.lock();}public:ShareDataSp m_charData;ShareDocDataSp m_docData;ShareDataMergeMangerWp m_shareDataMergeManger;};using LocalStyleSp std::shared_ptrLocalStyle;class Style {public:std::string hyperLink;int styleId;ShareDataSp charData;};class DocStyle {public:ShareDocDataSp docData;int align;};int main(int argc, char** argv){auto shareDataManger std::make_sharedShareDataMergeManger();auto shareCharData std::make_sharedShareData(0);auto shareDocData std::make_sharedShareDocData();BaseStyleSp localStyle std::make_sharedLocalStyle(shareCharData, shareDocData, shareDataManger);float size 1; //数据存在浮点精度无法准确去重暂时不优化localStyle-setProperty(BaseStyle::ProperyID::PROP_FONT_SIZE, size);size 2;localStyle-setProperty(BaseStyle::ProperyID::PROP_FONT_SIZE, size);size 0;localStyle-setProperty(BaseStyle::ProperyID::PROP_FONT_SIZE, size);return 0;}perf-10万样式-同时修改1万个-5-6ms(堆内存频繁分配合并释放尝试转栈)#include iostream#include chronoint main(int argc, char** argv){auto shareDataManger std::make_sharedShareDataMergeManger();size_t count 100000;std::vectorBaseStyleSp vctStyles;vctStyles.reserve(count);for (int i 0; i count; i) {auto shareCharData std::make_sharedShareCharData(i);auto shareDocData std::make_sharedShareDocData();BaseStyleSp localStyle std::make_sharedLocalStyle(shareCharData, shareDocData, shareDataManger);vctStyles.push_back(localStyle);}// 获取当前时间点auto start std::chrono::high_resolution_clock::now();float size 50000;auto shareCharData std::make_sharedShareCharData(size);auto shareDocData std::make_sharedShareDocData();BaseStyleSp localStyle std::make_sharedLocalStyle(shareCharData, shareDocData, shareDataManger);for (int i 40000; i 50000; i) {size i 1;vctStyles.at(i)-setProperty(BaseStyle::ProperyID::PROP_FONT_SIZE, size);}// 获取代码执行后的时间点auto end std::chrono::high_resolution_clock::now();// 计算代码执行的时间差auto duration std::chrono::duration_caststd::chrono::microseconds(end - start).count();// 输出运行时间std::cout 代码执行时间: duration 微秒 std::endl;return 0;}创作不易小小的支持一下吧

相关推荐

QML调用JS
QML调用JS

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 18:36:28

基于MAX14431与PIC18F86K90的工业SPI隔离方案设计与实践
基于MAX14431与PIC18F86K90的工业SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 18:35:27

ESP32+VESC的BLDC牵引控制单元设计与实现
ESP32+VESC的BLDC牵引控制单元设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 18:35:27

国产FPGA选型四大硬边界:IO兼容性、时钟确定性、配置可靠性与工具链收敛
国产FPGA选型四大硬边界:IO兼容性、时钟确定性、配置可靠性与工具链收敛

简介:本资源是一份面向FPGA初学者、嵌入式开发者及国产芯片选型工程师的国产FPGA器件横向对比分析文档,聚焦紫光同创、安路科技、智多晶、高云电子等主流厂商的中低端至高端产品线,解决国产替代背景下技术选型难、参数对比散、应用场景不清晰… · 2026/11/2 19:37:08

GraphRAG实战:知识图谱增强RAG系统的金融应用与优化
GraphRAG实战:知识图谱增强RAG系统的金融应用与优化

1. GraphRAG项目概述GraphRAG是微软研究院推出的基于知识图谱的检索增强生成(RAG)系统。这个开源项目通过将非结构化文本转化为结构化知识图谱,显著提升了LLM对私有数据的理解和推理能力。我在最近开发的金融问答机器人项目中深度使用了这套框… · 2026/11/2 19:37:08

ABAQUS ODB文件批量提取插件开发与应用指南
ABAQUS ODB文件批量提取插件开发与应用指南

1. 为什么需要ODB文件批量提取插件 在工程仿真领域,ABAQUS作为主流的有限元分析软件,其计算结果通常存储在ODB(Output Database)文件中。这些文件包含了丰富的场变量数据,如应力、应变、位移、反力等关键工程参数。然而… · 2026/11/2 19:37:08

研究生论文AI检测与降重工具实战指南
研究生论文AI检测与降重工具实战指南

1. 研究生学术写作中的AI检测现状2023年全球高校普遍开始采用AI检测工具来筛查学术论文,Turnitin等主流系统已能识别ChatGPT等AI工具生成的内容。根据斯坦福大学研究数据,约38%的研究生在论文写作中曾使用AI辅助,其中17%因AI率高被导师要求重… · 2026/11/2 19:37:08

FPGA流水灯工程化设计:从时钟生成到LED驱动的完整闭环
FPGA流水灯工程化设计:从时钟生成到LED驱动的完整闭环

简介:本资源是一份面向FPGA初学者与数字电路实践者的Verilog开发教程,聚焦流水灯这一经典数字系统设计案例,系统讲解时钟管理、状态机建模与模块化顶层设计方法。资源以1个952KB的Word文档(.docx)形式提供,… · 2026/11/2 19:37:08

uni-app跨端云开发实战:支付宝云+微信小程序数据不通的根因与解决方案
uni-app跨端云开发实战:支付宝云+微信小程序数据不通的根因与解决方案

1. 问题全景拆解:为什么偏偏是“支付宝云 微信小程序”这个组合出问题1.1 先把场景还原清楚这个标题里其实藏了三个技术主体:uni-app 跨端框架、支付宝云开发(云函数/云数据库)、微信小程序运行环境。三者叠在一起,问… · 2026/11/2 19:36:06

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

雷达信号调制技术解析:从LFM到伪线性调频原理与应用
雷达信号调制技术解析:从LFM到伪线性调频原理与应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略
基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

PLFM_RADAR:相位线性调频雷达信号处理框架
PLFM_RADAR:相位线性调频雷达信号处理框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码