内存池简单案例

内存池技术 内容: 本文将介绍几种常用的内存池技术的实现,这是我最近学习各大开源的内存池技术遗留下来的笔记,其主要内容包括:   STL内存池以及类STL内存池实现Memcached内存池实现固定规格内存池实现 Nginx内存池实现      一.类STL的内存池实现方式 SGI STL的内存池分为一级配置器和二级配置器, 一级配置器主要处理分配空间大小大于128Byte的需求,其 阅读详情

        本章借助nginx源码中实现的内存池模块,将其抽离出来并实现一个简单的demo用于比较说明内存池的优点。内存池结构详细说明请见另一篇博文Nginx学习之内存管理。

        首先,将nginx源码中ngx_palloc.h、ngx_palloc.c、ngx_alloc.h、ngx_alloc.c四个文件拷贝出来,对其做一下简单修改,使其不再依赖nginx项目源码。

        ngx_alloc.h具体代码如下:

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */

#ifndef _NGX_ALLOC_H_INCLUDED_
#define _NGX_ALLOC_H_INCLUDED_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <inttypes.h>

#ifndef u_char
#define u_char	unsigned char
#endif

#ifndef ngx_uint_t
#define	ngx_uint_t	 unsigned int
#endif

#ifndef ngx_int_t
#define ngx_int_t	int
#endif

#ifndef ngx_inline
#define ngx_inline      inline
#endif

void *ngx_alloc(size_t size, void *log);
void *ngx_calloc(size_t size, void *log);

#define ngx_free          free

#define ngx_memzero(buf, n)       (void) memset(buf, 0, n)
#define ngx_memset(buf, c, n)     (void) memset(buf, c, n)


/*
 * Linux has memalign() or posix_memalign()
 * Solaris has memalign()
 * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc()
 * aligns allocations bigger than page size at the page boundary
 */

#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN)

void *ngx_memalign(size_t alignment, size_t size, void *log);

#else

#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)

#endif


extern ngx_uint_t  ngx_pagesize;
extern ngx_uint_t  ngx_pagesize_shift;
extern ngx_uint_t  ngx_cacheline_size;


#endif /* _NGX_ALLOC_H_INCLUDED_ */

        ngx_alloc.c具体代码如下:

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */

#include "ngx_alloc.h"

ngx_uint_t  ngx_pagesize;
ngx_uint_t  ngx_pagesize_shift;
ngx_uint_t  ngx_cacheline_size;

void *
ngx_alloc(size_t size, void *log)
{
    void  *p;

    p = malloc(size);
    if (p == NULL) {
		printf("----------malloc(%u) failed---------\n", size);
    }

	// printf("----------malloc: %p:%u---------\n", p, size);
    return p;
}


void *
ngx_calloc(size_t size, void *log)
{
    void  *p;

    p = ngx_alloc(size, log);

    if (p) {
        ngx_memzero(p, size);
    }

    return p;
}


#if (NGX_HAVE_POSIX_MEMALIGN)

void *
ngx_memalign(size_t alignment, size_t size, void *log)
{
    void  *p;
    int    err;

    err = posix_memalign(&p, alignment, size);

    if (err) {
		printf("----------posix_memalign(%u, %u) failed---------\n", alignment, size);
        p = NULL;
    }

	printf("----------posix_memalign: %p:%u @%u---------\n",  p, size, alignment);

    return p;
}

#elif (NGX_HAVE_MEMALIGN)

void *
ngx_memalign(size_t alignment, size_t size, void *log)
{
    void  *p;

    p = memalign(alignment, size);
    if (p == NULL) {
		printf("----------memalign(%u, %u) failed---------\n", alignment, size);
    }

	printf("----------memalign: %p:%u @%u---------\n",  p, size, alignment);

    return p;
}

#endif

        ngx_palloc.h具体代码如下:

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */

#ifndef _NGX_PALLOC_H_INCLUDED_
#define _NGX_PALLOC_H_INCLUDED_

#include <stdio.h>
#include <errno.h>
#include "ngx_alloc.h"

#define ngx_close_file           close
#define ngx_close_file_n         "close()"

#define ngx_delete_file(name)    unlink((const char *) name)
#define ngx_delete_file_n        "unlink()"

#define NGX_ENOENT        ENOENT
#define ngx_errno         errno

#define  NGX_OK          0
#define  NGX_ERROR      -1
#define  NGX_AGAIN      -2
#define  NGX_BUSY       -3
#define  NGX_DONE       -4
#define  NGX_DECLINED   -5
#define  NGX_ABORT      -6

#define NGX_INVALID_FILE         -1
#define NGX_FILE_ERROR           -1

typedef int               			ngx_err_t;
typedef int                      	ngx_fd_t;
typedef struct ngx_pool_s			ngx_pool_t;
typedef struct ngx_chain_s			ngx_chain_t;

/*
 * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86.
 * On Windows NT it decreases a number of locked pages in a kernel.
 */
#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)

#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)

#define NGX_POOL_ALIGNMENT       16
#define NGX_MIN_POOL_SIZE                                                     \
    ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)),            \
              NGX_POOL_ALIGNMENT)

#ifndef NGX_ALIGNMENT
#define NGX_ALIGNMENT   sizeof(unsigned long)    /* platform word */
#endif

#define ngx_align_ptr(p, a)                                                   \
    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
			  
typedef void (*ngx_pool_cleanup_pt)(void *data);

typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler;
    void                 *data;
    ngx_pool_cleanup_t   *next;
};

typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};

typedef struct {
    u_char               *last;
    u_char               *end;
    ngx_pool_t           *next;
    ngx_uint_t            failed;
} ngx_pool_data_t;

struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    void            *log;
};

typedef struct {
    ngx_fd_t              fd;
    u_char               *name;
    void            	 *log;
} ngx_pool_cleanup_file_t;

ngx_pool_t *ngx_create_pool(size_t size, void *log);
void ngx_destroy_pool(ngx_pool_t *pool);
void ngx_reset_pool(ngx_pool_t *pool);

void *ngx_palloc(ngx_pool_t *pool, size_t size);
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
void *ngx_pcalloc(ngx_pool_t *pool, size_t size);
void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);

ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);
void ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd);
void ngx_pool_cleanup_file(void *data);
void ngx_pool_delete_file(void *data);

#endif /* _NGX_PALLOC_H_INCLUDED_ */

        ngx_palloc.c具体代码如下:

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */

#include "ngx_palloc.h"

static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size,
    ngx_uint_t align);
static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);

void ngx_pool_cleanup_file(void *data);

ngx_pool_t *
ngx_create_pool(size_t size, void *log)
{
    ngx_pool_t  *p;

    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    if (p == NULL) {
        return NULL;
    }

    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;

    size = size - sizeof(ngx_pool_t);

	// 最多分1页内存大小
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;

    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;

    return p;
}

void
ngx_destroy_pool(ngx_pool_t *pool)
{
    ngx_pool_t          *p, *n;
    ngx_pool_large_t    *l;
    ngx_pool_cleanup_t  *c;

	// 清理资源一些必要操作
    for (c = pool->cleanup; c; c = c->next) {
        if (c->handler) {
            printf("---------------c->handler(c->data)-----------------\n");
            c->handler(c->data);
        }
    }

#if (NGX_DEBUG)

    /*
     * we could allocate the pool->log from this pool
     * so we cannot use this log while free()ing the pool
     */

    for (l = pool->large; l; l = l->next) {
		printf("---------------free: %p-----------------\n", l->alloc);
    }

    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
		
		printf("---------------free: %p, unused: %u-----------------\n", p, p->d.end - p->d.last);
		
        if (n == NULL) {
            break;
        }
    }

#endif

	// 释放大块内存
    for (l = pool->large; l; l = l->next) {
        if (l->alloc) {
            ngx_free(l->alloc);
        }
    }

	// 释放 pool 内存
    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
        ngx_free(p);

        if (n == NULL) {
            break;
        }
    }
}

void
ngx_reset_pool(ngx_pool_t *pool)
{
    ngx_pool_t        *p;
    ngx_pool_large_t  *l;

    for (l = pool->large; l; l = l->next) {
        if (l->alloc) {
            ngx_free(l->alloc);
        }
    }

    for (p = pool; p; p = p->d.next) {
        p->d.last = (u_char *) p + sizeof(ngx_pool_t);
        p->d.failed = 0;
    }

    pool->current = pool;
    pool->chain = NULL;
    pool->large = NULL;
}

void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
#if !(NGX_DEBUG_PALLOC)
    if (size <= pool->max) {
        return ngx_palloc_small(pool, size, 1);
    }
#endif

    return ngx_palloc_large(pool, size);
}

void *
ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
#if !(NGX_DEBUG_PALLOC)
    if (size <= pool->max) {
        return ngx_palloc_small(pool, size, 0);
    }
#endif

    return ngx_palloc_large(pool, size);
}

static ngx_inline void *
ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)
{
    u_char      *m;
    ngx_pool_t  *p;

    p = pool->current;

    do {
        m = p->d.last;

        if (align) {
            m = ngx_align_ptr(m, NGX_ALIGNMENT);
        }

		// 如果该 pool 结构中满足size大小的内存,则返回
        if ((size_t) (p->d.end - m) >= size) {
            p->d.last = m + size;

            return m;
        }

		// 指向pool链表的下一个pool结构
        p = p->d.next;

    } while (p);

	// 如果所有的pool链表中没有符合的内存块,则重新申请一个pool
    return ngx_palloc_block(pool, size);
}

static void *
ngx_palloc_block(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    size_t       psize;
    ngx_pool_t  *p, *new;

    psize = (size_t) (pool->d.end - (u_char *) pool);

    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
    if (m == NULL) {
        return NULL;
    }

    new = (ngx_pool_t *) m;

    new->d.end = m + psize;
    new->d.next = NULL;
    new->d.failed = 0;

    m += sizeof(ngx_pool_data_t);
    m = ngx_align_ptr(m, NGX_ALIGNMENT);
    new->d.last = m + size;

    for (p = pool->current; p->d.next; p = p->d.next) {
        if (p->d.failed++ > 4) {
            pool->current = p->d.next;
        }
    }

    p->d.next = new;

    return m;
}

static void *
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
    void              *p;
    ngx_uint_t         n;
    ngx_pool_large_t  *large;

    p = ngx_alloc(size, pool->log);
    if (p == NULL) {
        return NULL;
    }

    n = 0;

    for (large = pool->large; large; large = large->next) {
        if (large->alloc == NULL) {
            large->alloc = p;
            return p;
        }

        if (n++ > 3) {
            break;
        }
    }

    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);
    if (large == NULL) {
        ngx_free(p);
        return NULL;
    }

    large->alloc = p;
    large->next = pool->large;
    pool->large = large;

    return p;
}

void *
ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)
{
    void              *p;
    ngx_pool_large_t  *large;

    p = ngx_memalign(alignment, size, pool->log);
    if (p == NULL) {
        return NULL;
    }

    large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);
    if (large == NULL) {
        ngx_free(p);
        return NULL;
    }

    large->alloc = p;
    large->next = pool->large;
    pool->large = large;

    return p;
}

ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{
    ngx_pool_large_t  *l;

    for (l = pool->large; l; l = l->next) {
        if (p == l->alloc) {
			
			printf("---------------free: %p-----------------\n", l->alloc);
			
            ngx_free(l->alloc);
            l->alloc = NULL;

            return NGX_OK;
        }
    }

    return NGX_DECLINED;
}

void *
ngx_pcalloc(ngx_pool_t *pool, size_t size)
{
    void *p;

    p = ngx_palloc(pool, size);
    if (p) {
        ngx_memzero(p, size);
    }

    return p;
}

ngx_pool_cleanup_t *
ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)
{
    ngx_pool_cleanup_t  *c;

    c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));
    if (c == NULL) {
        return NULL;
    }

    if (size) {
        c->data = ngx_palloc(p, size);
        if (c->data == NULL) {
            return NULL;
        }

    } else {
        c->data = NULL;
    }

    c->handler = NULL;
    c->next = p->cleanup;

    p->cleanup = c;

	printf("---------------add cleanup: %p-----------------\n", c);

    return c;
}

void
ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)
{
    ngx_pool_cleanup_t       *c;
    ngx_pool_cleanup_file_t  *cf;

    for (c = p->cleanup; c; c = c->next) {
        if (c->handler == ngx_pool_cleanup_file) {

            cf = c->data;

            if (cf->fd == fd) {
                c->handler(cf);
                c->handler = NULL;
                return;
            }
        }
    }
}

void
ngx_pool_cleanup_file(void *data)
{
    ngx_pool_cleanup_file_t  *c = data;

	printf("----------file cleanup: fd:%d---------\n", c->fd);

    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {
		printf("----------\"%s\" failed---------\n", c->name);
    }
}

void
ngx_pool_delete_file(void *data)
{
    ngx_pool_cleanup_file_t  *c = data;

    ngx_err_t  err;

	printf("----------file cleanup: fd:%d %s---------\n", c->fd, c->name);

    if (ngx_delete_file(c->name) == NGX_FILE_ERROR) {
        err = ngx_errno;

        if (err != NGX_ENOENT) {
			printf("----------\"%s\" failed---------\n",  c->name);
        }
    }

    if (ngx_close_file(c->fd) == NGX_FILE_ERROR) {
		printf("----------\"%s\" failed---------\n",  c->name);
    }
}

        测试主函数主要比较malloc/free申请内存及内存池申请的效率,main.c具体代码如下:

/***********************************************
*    Author : lijd
*    Date   : 2022-11-30
*	 Func   : 测试内存池功能主函数
***********************************************/

#include <stdio.h>

#include "ngx_palloc.h"

#define LOOP_NUM_1	(1024 * 400)
#define LOOP_NUM_2	(1024)
#define MEM_SIZE	16

#define MEM_POOL_SIZE (1024 * 4)

int main(int argc, char *const *argv)
{
	int i, j;
	if(argc == 1)
	{
		printf("-----------------malloc/free---------------\n");
		
		for(i = 0; i < LOOP_NUM_1; i++)
		{
			for(j = 0; j < LOOP_NUM_2; j++)
			{
				void *p = malloc(MEM_SIZE);
			
				if(p == NULL)
				{
					printf("malloc error !\n");
					return -1;
				}
				memset(p, 0, MEM_SIZE);
				free(p);
			}
		}
	}
	else
	{
		printf("-----------------mem pool---------------\n");
		
		for(i = 0; i < LOOP_NUM_1; i++)
		{
			ngx_pool_t *pool = ngx_create_pool(MEM_POOL_SIZE, NULL);
			
			for(j = 0; j < LOOP_NUM_2; j++)
			{
				void *p = ngx_palloc(pool, MEM_SIZE);
				
				if(p == NULL)
				{
					printf("ngx_palloc error !\n");
					return -1;
				}
				memset(p, 0, MEM_SIZE);
			}
			
			ngx_destroy_pool(pool);
		}
	}
	
	return 0;
}

        程序运行结果如下图:

内存池例子-有代码和解析 内存池的详细设计说明,有代码和解析 简单的内存池的实现 立即下载

相关推荐

vue使用 APlayer+Meting实现音乐播放,支持多平台音乐:网易云、腾讯、虾米、酷狗、百度

  我之前写过一篇博客:使用 APlayer 实现音乐播放器,虽然 APlayer 让我实现了想要的音乐播放器效果,但是音频列表 audio 的音频链接、音频封面、歌词等,是需要自己去补充的。   那么这些数据从哪里来呢?   我昨天有发愁一会儿会儿,也去搜了获取音乐列表的接口,可以发请求去获取数据嘛。   也有瞅见MetingJS,A powerful plugin connect APlayer and Meting,一个连接APlayer和Meting的功能强大的插件,附上GitHub地址:https

小R.的博客 4798

写个内存池的代码

内存池是一种常用的内存分配机制,它可以有效地管理内存分配和回收。 内存池的基本原理是,在程序运行时,先将一块固定大小的内存分配给内存池,然后在程序中需要分配内存的时候,就从内存池中申请内存。当程序使用完该内存块后,会将其归还给内存池,供其他部分使用。这样,就可以避免频繁地调用系统内存分配函数,提高程序效率。 下面是一个简单的内存池的代码示例,使用 C 语言实现: ``` #include <...

weixin_42599908的博客 130

双目立体成像(一)双目图片生成点云

利用左右目图片生成点云

qq_62964142的博客 4550

内存池的实现与场景分析

内存池的实现与场景分析

kakaka666的博客 623

细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解

本文以开发板上的SPI-Flash芯片W25Q16为媒介详细介绍CubeMX中FatFS各个参数的意义和设置,分析生成的代码中FatFS各个文件的作用和关联,完成针对W25Q16的硬件访问层的移植。继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。

wenchm的博客 1640

数字信号处理实验:信号谱分析与FFT算法的应用

​ (1)给定信号为 ,其中a为42,b为1。理论分析信号 的频率成分。 (2)分别采用采样频率为 , , , 对 进行采样,其中 , , , ,根据是否满足采样定理要求分析四种采样频率下频谱的分布,在满足采样定理情况下做频谱分析。 (3)任意生成两组有限长信号,对信号分别进行直接卷积和FFT算法求卷积,并分析圆周卷积与线性卷积的关系。

m0_56324525的博客 3201

内存池的简单设计案例源码(含线程锁)

头文件 MemoryPools.h #pragma once //尝试开发一个内存池,用于内存管理。 #include <stdio.h> #include <stdlib.h> #include "ThreadLock.h" #define MAX_MEMORYHEAD_SIZE 12 //4个字节的指针块地址 + 4个字节的链表首地址 + 4位验证码 #define MAGIC_CODE 0x123456 //验证码 #define

欧特GO 1130

基于点云数据的统计滤波算法改进

随着三维视觉和点云处理技术的发展,点云数据在机器人、自动驾驶、增强现实等领域得到了广泛应用。而点云数据中常常包含着各种噪声和异常点,这些噪声和异常点会影响后续的数据处理和分析任务。因此,对点云数据进行滤波处理是必不可少的一步。在点云滤波算法中,统计滤波(Statistical Filtering)是一种常见且有效的方法。它通过对点云数据进行统计分析,将噪声和异常点剔除或修复,从而得到更为准确和可靠的点云数据。本文将介绍一种改进的统计滤波算法,并提供相应的源代码实现。

QfcaLinux的博客 292

内存池简单实现(一)

概念 内存池就是在程序启动时,预先向堆中申请一部分内存,交给一个管理对象。在程序运行中,需要时向管理对象“借”,不需要时“还”给管理对象。 原理很简单,关键是怎样才能高效地“借”、“还”。 实例场景 在C/S服务器中,需要频繁地收发数据包。而数据包的内存采用原始的new-delete模式,会大大降低服务器性能,所以想到了使用内存池技术。 在此实例中有几个硬性条件: 1、数据包最大长度可...

Hi, Boy 8715

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1703

STM32Cube高效开发教程<高级篇><FreeRTOS>(一)-----FreeRTOS基础

一、 FreeRTOS概述声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。写在前面:今天就算正式开始高级篇的博客编写了,我本人也是第一次学习FreeRTOS,所以整体的进度会比较慢,博客更新可能不太会及时,希望大家原谅。一、 FreeRTOS概述。

我的博客 1845

内存池

内存池<!--document.write(打印本页);//--><!--document.write(将此页作为电子邮件发送);//-->将此页作为电子邮件发送未显示需要 JavaScr

abel__2008的专栏 984

(2-2-2)位置控制算法:常用的位置控制算法(2)

例如下面是一个使用滑模控制算法实现机器人位置控制的例子,在该例子中,假设机器人在一维空间中移动,目标是使机器人的位置迅速、鲁棒地达到设定的目标位置。自适应控制算法通过实时地调整控制器参数,可以适应系统的变化,从而提高系统的鲁棒性和性能。模型预测控制(Model Predictive Control,MPC)是一种先进的控制策略,通常应用于动态系统,以实现对系统状态的优化控制。(6)迭代优化:随着时间推移,MPC迭代执行上述步骤,持续优化控制输入,以适应系统动态和外部扰动,实现对系统状态的稳健控制。

码农三叔 1607

unity简单内存池案例

再创建一个正方体,同时再创建一个空脚本,命名为cube 挂上去,并将该正方体拖入下方文件浏览器中制成预制体。代码编写完后需要将该预制体拖入各个脚本里。在unity中创建一个空白物体命名为cubepawner,并拖到主摄像机之前。然后再创建cubepawner和cubePool脚本挂载到该物体上。

weixin_45712645的博客 433

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何设计一个简单内存池

什么是内存池???   通常我们用new或malloc来分配内存的话,由于申请的大小不确定,所以当频繁的使用时会造成内存碎片和效率的降低。为了克服这种问题我们提出了内存池的概念。内存池是一种内存分配方式。内存池的优点就是可以有效的减少内存碎片化,分配内存更快速,减少内存泄漏等优点。   内存池是在真正使用内存之前,先申请分配一个大的内存块留作备用。当真正需要使用内存的时候,就从内存池中分配一块

Sunnylunch-blog 6824

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

转 简单c++ 内存池

经典的内存池(mempool)技术,是一种用于分配大量大小相同的小对象的技术。通过该技术可以极大加快内存分配/释放过程。 内存池只涉及两个静态常量:Block_Size(mempool的容量大小)、Item_Size(小对象的大小,但不能小于指针的大小,在32位平台也就是不能小于4字节),以及两个指针变量BlockNodeHead、FreeItemNodeHead。开始,这两个指针均为空。 ...

yyuhui的博客 166

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

内存池的简单试验(C++)

 内存池的简单试验(C++)这是试验性的程序, 虽然算法实现简弱, 当在编译器优化后实验结果,性能比用全局new delete的内存管理好了很多,我这里有考虑到多线程看来在大量使用内存分配的程序,用内存池是能够显著提高性能的;有时间我会改进算法,有高手看到, 请指点一二, 我是非专业的, 算法方面很弱;还有数组的内存分配遇到了一些问题;以下数组的内存分配的一般模式void * oper

477

内存池(节点分配)

#ifndef JYMEMORY_POOL_H_ #define JYMEMORY_POOL_H_ #include "JYChunk.h" #include "JYMutex.h" #include #include #include using namespace std; class JYMemoryPool { public: J

qixianghui123的博客 486

一个最简单的内存池AutoMemory

C/C++中内存管理是个最麻烦的事情,内存申请释放,内存泄露,内存越界,甚至是内存碎片,就会导致程序出Core或者变慢。如何有效的管理内存,有很多方法,我认为最简单的方式是用一个内存池来管理内存。     谈到内存池的时候,就有必要说下程序的生命周期和作用域,数据分为三类:1类是进程数据(全局数据)。2、线程数据,每一个线程一份。3、请求数据,每一次调用一份。              如果

架构和代码 1936

分页池内存持续增长_C++内存管理内存池1

内存池定义:是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。内存池作用:1.减少内存碎片,每次申请一大片空间,当然减少了内存碎片 2.提高性能,其实malloc本身设计也是一个内存池,所以效率并不低。但是malloc会因为频繁的申请释放内存,而形成内存碎片,当我们申请...

weixin_39897218的博客 347

[原创]:c语言基于固定块链表的内存池

      文章首次发表在baidu的博客上,专业人士来的太少,所以挪到这里来了      内存池对于长时间运行的程序特别有用,可以减少内存碎片,提高效率,避免内存益处等众多好处,网上流传的内存池模型有很多种大致分为固定快大小的链表(本文采用的),这种内存池的优点是速度快,碎片少,缺点是灵活性不足,但对于搞定能的服务器端程序而言很多的数据都是已知的,为了追求速度这种牺牲是可以理解的;另外还

netpet(凌晓)的博客 1755

内存池(MemoryPool)

from: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26975042&id=4033505  c语言中,malloc/calloc/realloc, free; c++语言中new/delete/new[]/delete[] 来分配/释放内存.     1. 使用c/c++分配函数的问题         (1)在分配

浮尘丶若梦 522

一个高效的内存池实现

在高效C++编程中看到一个不错的内存池实现方案,这里共享下,大家看看有什么不足。 代码很简单,如下: template class CMemoryPool {     public:         enum { EXPANSION_SIZE = 32};         CMemoryPool(unsigned int nItemCount = EXPANSION_SIZE

jfkidear的专栏 770

C++---内存池

new:为对象开辟内存,调用构造函数做初始化 delete:调用析构函数释放对象的资源,释放空间 系统提供了operator new和operator delete void* operator new(size_t size) { void* ptr = malloc(size); cout << "operator new: " << ptr <&lt...

cyy_0802的博客 177

C++内存池的简单原理及实现

为什么要用内存池 C++程序默认的内存管理(new,delete,malloc,free)会频繁地在堆上分配和释放内存,导致性能的损失,产生大量的内存碎片,降低内存的利用率。默认的内存管理因为被设计的比较通用,所以在性能上并不能做到极致。 因此,很多时候需要根据业务需求设计专用内存管理器,便于针对特定数据结构和使用场合的内存管理,比如:内存池。 内存池原理 内存池的思想是,在真正使用内存之前,预先...

踏莎行的博客 1万+
上一篇: 狼羊菜过河(C实现)
下一篇: VS2008生产动态库、静态库调用案例
码农诗人
博客等级 码龄11年 987粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值