Golang 创建一个简单的内存池

内存池主要作用是减少内存分配和释放的开销,提高程序的性能和效率。内存池通过预先分配一块较大的内存区域,然后将这块区域分割成多个小块,用于存储特定类型的数据。这样,当程序需要分配内存时,可以直接从内存池中获取一块已经分配好的内存,而不是每次都从操作系统申请新的内存。内存池的主要作用包括:

**1、减少内存分配开销:**频繁的内存分配和释放(尤其是在大量小对象的情况下)会导致程序的性能下降。内存池通过重用已经分配的内存,减少了这种开销。

**2、提高内存利用率:**内存池可以减少内存碎片,因为内存池中的内存块是预先分配的,这样可以更有效地利用内存。

**3、降低垃圾回收(GC)的压力:**通过减少内存分配和释放的次数,内存池有助于降低垃圾回收器的工作负担,从而提高程序的运行效率。

**4、提高数据访问速度:**内存池中的内存块通常是连续存储的,这有助于提高缓存命中率,从而提高数据访问速度。

**5、支持并发编程:**内存池可以设计为线程安全的,这样在多线程或多Goroutine的环境中,可以并发地从内存池中分配和释放内存,而不需要额外的同步操作。

Go 复制代码
package main

import (
    "fmt"
    "sync"
)

// 定义一个简单的内存池结构体
type IntPool struct {
    pool chan *int
    locked bool
}

// 创建一个新的内存池实例
func NewIntPool() *IntPool {
    return &IntPool{
        pool: make(chan *int, 100), // 假设我们预先分配100个整数的空间
    }
}

// Get 方法从内存池中获取一个整数指针
func (p *IntPool) Get() *int {
    if p.locked {
        // 如果内存池被锁定,直接分配新的内存
        return new(int)
    }
    // 尝试从通道中获取一个整数指针
    if intPtr, ok := <-p.pool; ok {
        return intPtr
    }
    // 如果通道为空,分配新的内存
    return new(int)
}

// Put 方法将一个整数指针返回给内存池
func (p *IntPool) Put(intPtr *int) {
    if p.locked {
        // 如果内存池被锁定,直接释放内存
        return
    }
    // 将整数指针放回内存池的通道中
    p.pool <- intPtr
}

// main 函数中,我们演示如何使用内存池
func main() {
    pool := NewIntPool()

    // 从内存池中获取一个整数指针,并赋值
    ptr1 := pool.Get()
    *ptr1 = 10
    fmt.Println("Value from pool 1:", *ptr1)

    // 再次从内存池中获取一个整数指针
    ptr2 := pool.Get()
    *ptr2 = 20
    fmt.Println("Value from pool 2:", *ptr2)

    // 将一个指针返回给内存池
    pool.Put(ptr1)

    // 锁定内存池,之后的Put操作将不会放回内存,而是直接释放内存
    pool.locked = true

    // 再次将一个指针返回给内存池
    pool.Put(ptr2)
}
相关推荐
测试员周周4 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.6 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号36 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia7 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码7 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海8 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠8 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP9 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.08889999 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you10 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言