惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
About on SuperTechFans
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
O
OpenAI News
美团技术团队
月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
Schneier on Security
Schneier on Security
Webroot Blog
Webroot Blog
Cyberwarzone
Cyberwarzone
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
T
Tenable Blog
S
Security Affairs
博客园_首页
S
Schneier on Security
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Spread Privacy
Spread Privacy
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
Vercel News
Vercel News
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
B
Blog
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
L
LINUX DO - 最新话题
D
DataBreaches.Net
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - Franky
W
WeLiveSecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Check Point Blog
H
Hacker News: Front Page

博客园 - 悉野

ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 java服务器异常处理 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) go学习笔记8(反射) c++简单的线程池 operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记4(数组与切片,map,if,switch,for循环) go学习笔记3(变量定义,输入输出,基本数据类型) go学习笔记2 laya打包的apk版本更新脚本 laya列表滚动问题 laya踩坑记 laya列表时计算具体体子项是列表中第几个 子弹射击 laya给自己画边框 查看laya已经加载的资源 laya spine事件
C++的定位放置new(Placement new)
悉野 · 2026-04-12 · via 博客园 - 悉野

c++ primer第18章 特殊工具与技术 优化内存分配 

char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass(); // 在buffer上构造对象

内存池(Memory Pool)通过预分配大块内存并使用定位new在其中构造对象,可显著减少内存碎片和分配延迟。

class MemoryPool {
public:
    void* allocate() { /* 返回预分配内存块 */ }
    void deallocate(void* p) { /* 回收内存块 */ }
};

MemoryPool pool;
MyClass* obj = new (pool.allocate()) MyClass(); // 使用内存池分配

对象池实现(使用 malloc + placement new)

template<typename T>
class ObjectPool {
    std::vector<T*> available_;
    std::vector<void*> memory_blocks_;  // 预分配的内存块
    
public:
    // 预分配 N 个对象的空间
    void Init(size_t count) {
        void* block = malloc(sizeof(T) * count);  // 一次性分配大块内存
        memory_blocks_.push_back(block);
        
        for (size_t i = 0; i < count; ++i) {
            available_.push_back(reinterpret_cast<T*>(
                static_cast<char*>(block) + i * sizeof(T)
            ));
        }
    }
    
    T* Acquire() {
        if (available_.empty()) return nullptr;
        T* obj = available_.back();
        available_.pop_back();
        new (obj) T();  // placement new:在已分配内存上构造
        return obj;
    }
    
    void Release(T* obj) {
        obj->~T();      // 显式析构
        available_.push_back(obj);  // 回收到池中,内存不释放
    }
    
    ~ObjectPool() {
        for (auto block : memory_blocks_) free(block);
    }
};

参考:https://blog.csdn.net/FeiPeng_/article/details/108281837