- 博客(9)
- 收藏
- 关注
原创 C++系列-new与内存池
虽然标准内存分配器的用户态缓存可以减少系统调用的频率,但在高性能应用中,自定义内存池能够提供更高效的内存管理,优化性能,减少内存碎片,提高并发处理能力,和提高整体内存使用的灵活性。因此,对于性能要求较高的应用程序,实现一个额外的内存池是非常有必要的。
2024-10-01 22:00:43
1960
原创 Linux系列-send recv与read write以及sendto的区别
在网络编程中,`send`、`recv`、`read`、`write`都是常用的系统调用或函数,用于在套接字上发送或接收数据。- `send`和`recv`具有更多针对网络通信的特殊功能,可以通过`flags`参数来设置不同的发送或接收模式,如非阻塞、查看而不移除数据等。在网络编程中,`send`和`sendto`函数都用于发送数据,但它们在使用场景上有所不同,尤其是在面向连接(TCP)和无连接(UDP)协议中。- `read`和`write`是通用的I/O函数,可以用于文件、管道、设备以及网络套接字等。
2024-09-21 13:49:16
959
原创 数据结构与算法系列-二叉树序列化与反序列化
反序列化,输入是一个字符串string,输出是一个二叉树的头节点指针。接着来实现序列化,输入是一颗二叉树的头节点以及待输出的字符串。
2024-09-19 21:08:09
215
原创 c++系列-memcpy与memmove
**源内存区域在目标内存区域之后**:如果源区域的起始地址比目标区域的起始地址要高,即 `src > dest`,且重叠,`memmove` 会从**后向前**拷贝。- **源内存区域在目标内存区域之前**:如果源区域的起始地址比目标区域的起始地址要低,即 `src < dest`,且重叠,`memmove` 会从**前向后**拷贝。- **后向拷贝**(`src` 在 `dest` 之后):按从高地址到低地址的顺序逐字节或逐块进行拷贝,确保目标内存未被覆盖时就拷贝源内存。
2024-09-15 11:19:46
355
原创 c++系列-类型擦除
一个常见的例子是 `std::any` 和 `std::function`,它们利用类型擦除来存储和调用不同类型的对象。1. **运行时开销**: 类型擦除通常通过虚函数、内存分配和动态类型检查实现,这会增加一定的运行时开销(例如 `std::function` 和 `std::any` 中的额外内存分配和类型存储)。3. **存储类型信息**: 在某些类型擦除的实现中(如 `std::any`),底层存储对象的类型信息,以便在需要时(例如通过 `std::any_cast`)重新获得该类型。
2024-09-14 01:36:03
436
原创 Linux系列-进程切换与线程切换谁更耗时
当发生进程切换时,操作系统需要切换**虚拟地址空间**,更新**页表**,重新加载**内核态**的上下文信息,清理缓存、刷新 TLB(Translation Lookaside Buffer,地址转换缓存)等。- **进程切换**通常比**线程切换**耗时更多,主要是因为进程切换涉及虚拟地址空间的切换、页表的切换、内核资源的保存与恢复等,而线程切换只需要保存和恢复寄存器和堆栈指针等较少的上下文信息。**进程切换不一定比线程切换耗时**,但通常情况下,**进程切换**的开销比**线程切换**更大。
2024-09-14 01:23:39
310
原创 c++系列-菱形继承与虚继承
在这个例子中,`D`类通过`B`和`C`两条路径继承了`A`类,这样`D`类会有两份`A`类的成员(如`value`),造成内存冗余和访问冲突。当创建 `D` 类的对象时,由于 `D` 通过 `B` 和 `C` 虚继承了 `A`,编译器会生成一个虚基类表(vtable),用于记录 `A` 在 `D` 类对象中的偏移。比如在上面的例子中,`A`的构造函数会由`D`来调用,而不是`B`或`C`。在这个例子中,`B`和`C`都通过虚继承继承了`A`类,这样`D`类中只会有一份`A`类的拷贝。
2024-09-14 01:17:26
354
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人