<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[EricShiOce的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/EricShiOce</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; EricShiOce]]></copyright><item><title><![CDATA[＜九＞Pimp设计习语]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134919690</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134919690</guid><author>EricShiOce</author><pubDate>Mon, 11 Dec 2023 10:08:59 +0800</pubDate><description><![CDATA[Pimp]]></description><category></category></item><item><title><![CDATA[＜八＞异常机制]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134811580</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134811580</guid><author>EricShiOce</author><pubDate>Tue, 05 Dec 2023 17:19:58 +0800</pubDate><description><![CDATA[• 只有特殊的硬实时系统对时间开销（异常抛出时），或者嵌入式系统对空间开销（代码膨胀）极度敏感时，才关闭异常（决策前测量）针对异常中立的函数（自己不抛，但调用的函数可能会抛），不要试图捕获所有异常，来实现noexcept。• C++11废弃了异常规约（列举函数可能抛出的异常），而采用noexcept表示是否抛出异常。• throw 抛出异常, try 包含可能抛异常的语句块，catch 语句捕获异常。• 异常不抛出时没有额外性能负担，只有抛出时才有（比错误码大）只有移动操作不抛出异常，才使用移动；]]></description><category></category></item><item><title><![CDATA[＜一＞Observer 观察者模式]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134704473</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134704473</guid><author>EricShiOce</author><pubDate>Mon, 04 Dec 2023 10:08:52 +0800</pubDate><description><![CDATA[定义对象间的一种一对多（变化）的依赖关系，以便当一个对象(Subject)的状态发生改变时，所有依赖于它的对象都得到通知并自动更新以 下载过程发出进度通知 为例//版本一public://1.网络下载准备//2.文件流处理//3.设置进度条i++){//...//4.文件存储int main()//详细代码省略在上面的代码问题,在FileDownload代码中带着界面层代码版本二public:public://1.下载动作//2.设置进度。]]></description><category></category></item><item><title><![CDATA[＜一＞关于继承和多态]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134703542</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134703542</guid><author>EricShiOce</author><pubDate>Thu, 30 Nov 2023 09:09:58 +0800</pubDate><description><![CDATA[C++继承和多态]]></description><category></category></item><item><title><![CDATA[＜一＞C++ 对象内存模型——继承]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134603079</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134603079</guid><author>EricShiOce</author><pubDate>Tue, 28 Nov 2023 16:08:09 +0800</pubDate><description><![CDATA[C++继承对象内存模型]]></description><category></category></item><item><title><![CDATA[＜七＞C++项目中戒除C语言的“不良习惯”]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134582120</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134582120</guid><author>EricShiOce</author><pubDate>Thu, 23 Nov 2023 17:12:17 +0800</pubDate><description><![CDATA[• 当一定要用C 时，应使用C 和C++ 的公共子集，并将C 代码以C++ 来编译。• 辨析使用场景和对象所有权，谨慎使用裸指针。• 使用模板和编译时计算等替换C风格的宏机制。• 严格避免malloc() 和free()• 使用C++类型转换替换C风格的强制转换。• 尽量避免全局数据，谨慎使用全局函数。]]></description><category></category></item><item><title><![CDATA[＜六＞字符串最佳实践]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134581918</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134581918</guid><author>EricShiOce</author><pubDate>Thu, 23 Nov 2023 17:09:38 +0800</pubDate><description><![CDATA[C++字符串最佳实践]]></description><category></category></item><item><title><![CDATA[＜五＞数组最佳实践]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134547480</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134547480</guid><author>EricShiOce</author><pubDate>Thu, 23 Nov 2023 17:04:28 +0800</pubDate><description><![CDATA[•使用vector实现变长数组，替代堆上的C风格数组。•使用array实现定长数组，替代栈上的C风格数组。•不要使用指针传递数组，传递指针仅代表单个对象。•不要使用C风格数组承载多态对象（基类、子类）•不带长度信息，易错点：拷贝、传参、返回值。•尽量避免使用C风格数组，有很多安全隐患。•本质是指针指向的一块连续内存，引用语义。]]></description><category></category></item><item><title><![CDATA[＜三＞特殊成员函数与三法则]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134523882</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134523882</guid><author>EricShiOce</author><pubDate>Wed, 22 Nov 2023 10:02:50 +0800</pubDate><description><![CDATA[特殊成员函数与三法则（Rule of Three）• 四大特殊成员函数• 默认构造函数（无参）, 如果不定义任何拷贝构造，编译器自动生成• 析构函数/ 拷贝构造函数/ 赋值操作符，如果不定义，编译器自动生成• 使用default 让编译器自动生成。• 使用delete 让编译器不要自动生成。• 三法则：析构函数、拷贝构造函数、赋值操作符三者自定义其一，则需要同时定义另外两个，特别是有堆对象指针成员（编译器自动生成的一般语义错误）。(C++98)]]></description><category></category></item><item><title><![CDATA[＜二＞C++对象模型基础]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134508632</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134508632</guid><author>EricShiOce</author><pubDate>Mon, 20 Nov 2023 15:01:41 +0800</pubDate><description><![CDATA[• 按照实例数据成员声明顺序从上到下排列（与C语言保持兼容）• 对象内存对齐是为了优化CPU存储数据效率、避免数据截断。• 可使用#pragma pack(4)控制。• 简单优化：长字段放前，短字段置后（聚集）• 按对齐系数（4字节、8字节）整倍数。虚函数指针占用一个指针size。• C++对象内存布局。• 内存对齐与填充——]]></description><category></category></item><item><title><![CDATA[＜一＞基于对象编程]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134506192</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134506192</guid><author>EricShiOce</author><pubDate>Mon, 20 Nov 2023 14:45:58 +0800</pubDate><description><![CDATA[• 数据成员（字段） + 函数成员。• 实例成员与this指针。]]></description><category></category></item><item><title><![CDATA[＜九＞指针和引用]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134502966</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134502966</guid><author>EricShiOce</author><pubDate>Mon, 20 Nov 2023 11:20:15 +0800</pubDate><description><![CDATA[• 尽可能避免以原始指针（T*）或引用（T&）来传递所有权（使用智能指针传递所有权）。• 辨析指针、引用所指向对象的存储位置、生命周期、以及是否拥有对象所有权。]]></description><category></category></item><item><title><![CDATA[＜八＞裸指针万恶之源]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134501553</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134501553</guid><author>EricShiOce</author><pubDate>Mon, 20 Nov 2023 10:56:48 +0800</pubDate><description><![CDATA[• 分配与删除错误匹配—— new和free搭配，malloc和delete搭配，new和。• 悬浮指针—— 使用已释放内存（读取、或写入）、返回栈对象地址。• 删除非堆对象指针——对栈对象、全局/静态对象地址进行删除。• 对象类型不清晰（栈对象、堆对象、数组对象、资源句柄？delete搭配，new[]和delete[] 搭配。• 重复删除—— 对已经删除过的对象，进行二次删除。• 内存泄漏——忘记delete之前new的内存。• 使用失效引用(悬浮引用,悬浮指针)• 所有权不清晰（谁分配，谁释放？]]></description><category></category></item><item><title><![CDATA[＜四＞关于变量生命周期和初始化]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134439034</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134439034</guid><author>EricShiOce</author><pubDate>Fri, 17 Nov 2023 09:30:26 +0800</pubDate><description><![CDATA[• 统一初始化：int a1{100};• 基本数值类型，以及auto自动推断类型声明，可以继续使用赋值初。• 大多数情况推荐使用统一初始化，又叫列表初始化，特别是对象、• 和表达式周期一致，通常类似自动对象（绑定引用除外）• 全局变量，函数中的静态变量，类静态数据成员。• 自声明开始，到声明语句所在块结尾}释放。• 随线程创建而创建，随线程结束而释放。• 构造初始化：int a4(100);• 赋值初始化：int a3=100;• 程序启动后加载，程序结束释放。• 堆变量，自由存储对象。]]></description><category></category></item><item><title><![CDATA[＜三＞值语义与引用语义]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134438993</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134438993</guid><author>EricShiOce</author><pubDate>Thu, 16 Nov 2023 12:14:44 +0800</pubDate><description><![CDATA[• 值语义有很多好处：没有悬浮指针/引用，没有昂贵的释放操作，没有内存泄漏，没有数据竞争……但是值语义大对象拷贝代价高昂，不能支持虚函数多态，不能维持对象全局唯一性……• 引用语义：对象以指针或引用的方式间接存储，参数、返回值、拷贝传递的是指针或引用。不存在特权类型或限定（其他语言则不，这是C++的独特性之一）。• 值语义：对象以值的方式直接存储，传参、返回值、拷贝等。对内置类型和用户自定义类型提供同等支持。]]></description><category></category></item><item><title><![CDATA[＜二＞关于栈内存和堆内存]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134437578</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134437578</guid><author>EricShiOce</author><pubDate>Thu, 16 Nov 2023 11:14:31 +0800</pubDate><description><![CDATA[• 栈内存有大小限制，可能会溢出，例如Linux默认为8MB，Windows默认为1MB。• 堆内存有很高灵活性，虽性能较差，但可通过相关设施和编程技巧精细控。• 堆内存大小没有栈内存严格限制，与机器内存总量和进程寻址空间相关。• 如果生存周期短，拷贝较少（传参、返回值），栈内存性能更好。• 堆内存在长运行程序有内存碎片效应，小块空闲内存得不到重用。• 对象释放时，手动释放堆内存（delete/free）• 栈上对象线性分配，连续排列，没有内存碎片效应。• 栈内存分配快，布局连续，缓存友好，释放快。]]></description><category></category></item><item><title><![CDATA[＜一＞关于进程虚拟地址空间区域内存划分和布局]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/134437041</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/134437041</guid><author>EricShiOce</author><pubDate>Thu, 16 Nov 2023 11:11:41 +0800</pubDate><description><![CDATA[在上面给出的进程地址空间经典布局图中，共享库的装载地址为0x40000000，这实际上是Linux kernel 2.6版本之前的情况了，在2.6版本里，共享库的装载地址已经被挪到靠近栈的位置，即位于0xBFxxxxxx附近，因此，此时的堆范围就不会被共享库分割成2个“碎片”，故kernel 2.6的32位Linux系统中，malloc申请的最大内存理论值在2.9GB左右。泄漏的内存往往比忘记释放的数据结构更大，因为所分配的内存通常会圆整为下个大于申请数量的2的幂次(如申请212B，会圆整为256B)。]]></description><category></category></item><item><title><![CDATA[＜七＞智能指针之__强弱指针使用场景之 多线程访问共享对象问题]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/130958051</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/130958051</guid><author>EricShiOce</author><pubDate>Wed, 31 May 2023 08:30:00 +0800</pubDate><description><![CDATA[weak_ptr是对对象的一种弱引用，它不会增加对象的use_count，weak_ptr和shared_ptr可以相互转化，shared_ptr可以直接赋值给weak_ptr，weak_ptr也可以通过调用lock函数来获得shared_ptr。即使有weak_ptr指向对象，对象也还是会被释放。weak_ptr并没有重载operator->和operator *操作符，因此不可直接通过weak_ptr使用对象，典型的用法是调用其lock函数来获得shared_ptr示例，进而访问原始对象。]]></description><category></category></item><item><title><![CDATA[＜六＞内存分配&智能指针内存泄漏问题]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/130937345</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/130937345</guid><author>EricShiOce</author><pubDate>Tue, 30 May 2023 10:52:56 +0800</pubDate><description><![CDATA[【代码】＜六＞内存分配&智能指针内存泄漏问题。]]></description><category></category></item><item><title><![CDATA[＜五＞智能指针之__自定义删除器]]></title><link>https://blog.youkuaiyun.com/EricShiOce/article/details/130875465</link><guid>https://blog.youkuaiyun.com/EricShiOce/article/details/130875465</guid><author>EricShiOce</author><pubDate>Thu, 25 May 2023 21:18:53 +0800</pubDate><description><![CDATA[但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配，为了使能和fopen的管理空间匹配，我们需要定制删除器。unique_ptr的成员函数在上面的博客中几乎全部涵盖，其实还有一个知识点，即std::unique_ptr::get_deleter字面已经很明显了，就获得deleter。加入lambda表达式和function，避免多个删除器类的定义，否则每自定义一个删除器，都要去写一个对应的类，太麻烦。通过自定义删除器,可以实现一些场景下的资源释放和删除.]]></description><category></category></item></channel></rss>