【C++内存管理】7_VC6、BC5、G2.9、G4.9 的标准分配器实现

2021-05-18
阅读 3 分钟
3.3k
VC6 下的malloc 内存块布局对应图中自上而下的内存消耗[debug mode]: {代码...} {代码...} 考虑 cookie 的占用比,在实际工程中的往往是海量的小区块,cookie 会占用较高的空间比率去除 cookie 的条件:管理的元素大小一致VC6 标准分配器的实现VC6 的 allocator 只是以 ::operator new 和 ::operator delete 完成 alloc...

【C++内存管理】7_new handler

2021-05-17
阅读 2 分钟
1.7k
当 operator new 没有能力为分配出我们所申请的 memory,会抛出一个 std::bad_alloc exception。某些老编译器则是返回 0 ,现代编译器仍然可以这样做:new (nothrow) Foo;

【C++内存管理】6_static allocator

2021-05-16
阅读 8 分钟
1.3k
上一章完成的两个 allocator 必须为不同的 classes 重写一遍几乎相同的 member operator new 和 member operator delete,应该有方法将一个总是分配特定尺寸块的 memory allocator 概念包装起来,使它容易被重复使用。以下展示一种方式,每个 allocator object 都是个分配器,它维护一个 free-list;不同的 allocator ob...

【C++内存管理】5_Per-class allocator

2021-05-16
阅读 5 分钟
1.3k
自定义内存操作的意义:降低 malloc 调用次数,提高内存空间利用率(每次 malloc 会携带上下 cookies[8bytes]标记)降低 malloc 调用次数,提高内存管理速度

【C++内存管理】4_内存分配的重载示例

2021-04-24
阅读 8 分钟
1.7k
类内重载 operator new/operator delete 示例 {代码...} 当 Foo 无虚析构函数时,输出: {代码...} 当 Foo 有虚析构函数时,输出: {代码...} 当类中带有虚函数时,会多占用 4 字节内存空间。(为虚函数表指针,以实现多态) {代码...} 当 Foo 无虚析构函数时,输出[类中重载版本 new / delete 未被调用]: {代码...} 当...

【C++内存管理】4_内存分配的重载

2021-04-24
阅读 3 分钟
2.2k
C++ 应用程序,内存分配的途径默认的内存分配方式关于 ① 处的说明(成员函数的自定义内存分配) {代码...} 关于 ② 处的说明 (重载全局空间的内存管理策略) {代码...} 容器的内存分配方式容器并未采用默认的内存管理方式,而采用内存分配器重新实现内存分配与构造被重新封装彼此分离内存释放与析构被重新封装彼此分离 {代码...

【C++内存管理】3_placement new

2021-04-24
阅读 1 分钟
1.1k
placement new 允许我们将 object 构建于 allocated memory 中;没有所谓 placement delete, 因为 placement new 根本没分配 memory;亦或称呼与 placement new 对应的 operator delete 为 placement delete。 {代码...} {代码...} {代码...}

【C++内存管理】2_array new & array_delete

2021-04-24
阅读 3 分钟
1.2k
问:没对数组里面的每个对象调用析构函数(示例二),会有什么影响呢?对 class without pointer 可能没有影响(不会有资源泄露)

【C++内存管理】1_内存分配的每个层面

2021-03-30
阅读 5 分钟
2.4k
C++ 应用程序,使用 memory 的途径C++ memory primitives分配释放类属可否重载malloc()free()C 函数不可newdeleteC++ 表达式不可::operator new()::operator delete()C++ 函数可allocator<T>::allocate()allocator<T>::deallocateC++ 标准库可自由设计并予以搭配任何容器 {代码...} {代码...} {代码...} {代...

【C++并发与多线程】 13_线程池浅谈,线程数量总结

2021-02-16
阅读 1 分钟
3k
线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处...

【C++并发与多线程】 12_recursive_mutex、timed_mutex、recursive_timed_mutex

2021-02-15
阅读 6 分钟
2k
window 临界区window 临界区资源对象与C++的 std::mutex 对象类似,可以保护多个线程对临界区资源的访问。 {代码...} 输出: {代码...} 多次进入临界区实验window 临界资源对象可以在同一线程中多次重复进入,对应次数的离开,程序仍正常执行。std::mutex 对象只能在同一线程进行一次加锁并对应一次解锁,否则程序抛出异...

【C++并发与多线程】 11_std::atomic叙谈、std::launch(std::async) 深入

2021-02-14
阅读 3 分钟
3.2k
std::atomic 叙谈原子类模板完全专用于基本整数类型(bool除外),以及 <cstdint> 中 typedef 所需的任何扩展整数类型。专用的基本数据类型: {代码...} 附加的成员函数: {代码...} 对于 bool 实例化,仅支持常规原子操作。请注意,大多数 c-style 原子类型都是这些专门化的别名(或这些专门化继承的基类的别名)...

【C++并发与多线程】 10_shared_future、automic

2021-02-14
阅读 4 分钟
2.2k
一个 shared_future 对象行为类似于 future 对象,除了它可以被赋值,而且一个以上的 shared_future 可以在他们的共享状态结束时共享所有权。它们还被允许一旦准备好就多次检索共享状态下的值。

【C++并发与多线程】 9_async、future、packaged_task、promise

2021-02-09
阅读 11 分钟
3.6k
std::future {代码...} future 是一个对象,可以从某个提供对象或函数中检索值,如果在不同线程中,则可以正确同步此访问。“有效” future 对象,通过调用一下函数之一来构造:asyncpromise::get_futurepackaged_task::get_futurefuture 对象仅在他们有效时才有用。默认构造的 future 对象五项(除非移动分配一个有效的 f...

【C++并发与多线程】 8_condition_variable、wait、notify_one、notify_all

2021-02-08
阅读 8 分钟
5.1k
当调用其等待函数(wait,wait_for,wait_until)之一时,它使用 unique_lock (通过互斥锁)来锁定线程,该线程将保持阻塞状态,直到被另一个同在 condition_variable 对象上调用通知功能的线程唤醒为止;

【C++并发与多线程】 7_单例设计模式、call_once

2021-02-07
阅读 4 分钟
1.2k
懒汉式单例类 {代码...} 饿汉式单例类 {代码...} 懒汉式的 call_once 实现 {代码...} 准确执行一次可调用对象 fn ,即使同时从多个线程调用。 {代码...} 单例类的资源清理【饿、懒同理】 {代码...}

【C++并发与多线程】 6_unique_lock 类模板详解

2021-02-07
阅读 7 分钟
4.5k
std::unique_lock 内部持有 mutex 的状态(locked,unlocked),因此比 lock_guard 使用更加灵活但同时更占用空间、速度更慢。

【C++并发与多线程】 5_互斥量概念、用法、死锁演示及详解

2021-02-02
阅读 7 分钟
2.2k
互斥量的基本概念临界资源:每次只允许一个线程进行访问(读/写)的资源线程间的互斥(竞争):多个线程在同一时刻都需要访问临界资源mutex 类(互斥量)是一把线程锁,保证线程间的互斥利用线程锁能够保证临界资源的安全互斥量的用法lockmutex.lock()当锁空闲时,获取并继续执行当锁被获取时,阻塞并等待锁释放mutex.un...

【C++并发与多线程】 4_创建多个线程、数据共享问题分析

2021-02-02
阅读 3 分钟
1.5k
创建和等待多个线程使用容器类简单管理多个线程。 {代码...} 输出:[输出结果每次可能是不一致的,因为子线程间竞争运行未做同步处理] {代码...} 数据共享问题分析只读多线程只读同一资源是安全的。 {代码...} 输出:[输出结果每次可能是不一致的,因为子线程间竞争运行未做同步处理] {代码...} 同时读写多线程同时读、...

【C++并发与多线程】 3_线程传参数详解,detach 注意事项

2021-02-01
阅读 7 分钟
3.5k
引用作为参数时,发生参数拷贝而不是引用传递;同时使用 std::ref() 与 thread::detach() 时,需要考虑主线程中的局部属性资源(对象)是否被子线程使用,并且主线程是否先于子线程结束。

【C++并发与多线程】 2_线程启动、结束,创建线程多种方法,join,detach

2021-01-31
阅读 5 分钟
5k
进程结束标志:主线程是否结束。如果主线程执行完毕,则代表整个进程结束,一般情况下此时如果还有其它子线程未执行完,则子线程会被强行终止(例外:detach)。

【C++并发与多线程】 1_并发基本概念及实现,进程、线程基本概念

2021-01-31
阅读 2 分钟
1.7k
以往计算机为单核CPU(中央处理器):某一时刻只能执行一个任务,由操作系统调度,每秒钟进行多次“任务切换”,这并不是真正的并发。同时任务切换需要保存与恢复任务上下文,存在时间开销。

【C++】 C++11 新特性-总结

2020-03-24
阅读 1 分钟
5.3k
系列文章整理于侯捷老师视频课程《C++新标准C++11/14》,在此感谢老师的辛勤付出。视频中不全面但较为深刻的整理了 C++11/14 的部分重要新特性,包括语言和标准库两部分,尤其是对新特性背后的原理进行分析。

【C++】 7_C++11 新特性-标准库篇

2020-03-23
阅读 22 分钟
1.8k
This header defines a series of classes to obtain type information on compile-time.

【C++】 6_C++11 新特性-标准库篇

2020-03-22
阅读 15 分钟
2.7k
容器 - 结构与分类 容器 array TR1 实现:[没有 ctor, 没有 dtor] {代码...} {代码...} G4.9 实现 文件:array {代码...} {代码...} 容器 hashtable Separate Chaining.虽然list是线性搜索时间,如果list够小,搜索速度仍然非常快。 上图当前篮子的数量为53([0-52],一般为vector),元素个数为6(元素代码hashcode[53, 55...

【C++】 5_C++11 新特性-标准库篇

2020-03-19
阅读 17 分钟
1.7k
Rvalue references are a new reference type introduced in C++0x that help solver the problem of unnecessary copying and enable perfect forwarding. When the right-hand side of an assignment is an rvalue, then the left-hand side object can 'steal' resource from the right-hand side object rather than...

【C++】 4_C++11 新特性-语言篇

2020-03-16
阅读 7 分钟
2.1k
变化的是 template parameter 参数个数(variable number) 利用参数个数递减的特性,实现递归函数调用。使用 function template完成

【C++】 3_C++11 新特性-语言篇

2020-03-10
阅读 13 分钟
3k
using-directive for namespace and using-declarations for namespace members

【C++】 2_C++11 新特性-语言篇

2020-03-08
阅读 11 分钟
4.1k
explicit explicit for ctors taking one argument 此关键字是一个声明说明符,只能应用于类内构造函数声明。 显式构造函数不能参与隐式转换。 文件:Test.cpp {代码...} 输出: {代码...} 说明:Complex c2 = c1 + 5; 编译器查找是否有函数可以被匹配调用,查找得到类内自定义实现 ' operator + ',但参数类型为 'const ...

【C++】 1_C++11 新特性-语言篇

2020-03-04
阅读 16 分钟
2.2k
Header files C++2.0 新特性包括语言和标准库两个方面,后者以 header files 形式呈现。 C++ 标准库的header files不带.h,例如: #include <vector> 新式 C header files 不带.h,例如: #include<cstdio> 旧式 C header files (带有.h) 仍可用,例如:#include <stdio.h> 编译器对 C++2.0 的支持 C++...