文档章节

一个简单的c++内存池管理器实现(修改自intel ipp speech-codec)

chinacharis
 chinacharis
发布于 2016/03/15 16:47
字数 784
阅读 43
收藏 0

利用c++实现一个简单的内存池管理器

头文件scratchmem.h

/*****************************************************************************
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2005-2007 Intel Corporation. All Rights Reserved.
//
// Intel(R) Integrated Performance Primitives
//
//     USCI - Unified Speech Codec Interface
//
// Purpose: Scratch memory managment header file.
***************************************************************************/

#ifndef __SCRATCHMEM_H__
#define __SCRATCHMEM_H__

typedef unsigned char   Ipp8u;
typedef unsigned short Ipp16u;
typedef unsigned int    Ipp32u;

typedef signed char    Ipp8s;
typedef signed short   Ipp16s;
typedef signed int     Ipp32s;


/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

#if defined(__ICC) || defined( __ICL ) || defined ( __ECL )
#define __INLINE static __inline
#elif defined( __GNUC__ )
#define __INLINE static __inline__
#else
#define __INLINE static
#endif

#if defined(__ICL ) || defined ( __ECL )
/* Intel C/C++ compiler bug for __declspec(align(8)) !!! */
#define __ALIGN(n) __declspec(align(16))
#define __ALIGN32 __declspec(align(32))
#else
#define __ALIGN(n)
#define __ALIGN32
#endif

#if (defined (_WIN64) || defined(linux64) || defined(linux32e)) && !defined(_WIN32_WCE)
typedef __INT64 Ipp64s;
__INLINE
Ipp64s IPP_INT_PTR( const void* ptr ) {
    union {
        void*   Ptr;
        Ipp64s Int;
    } dd;
    dd.Ptr = (void*)ptr;
    return dd.Int;
}
__INLINE
Ipp64u IPP_UINT_PTR( const void* ptr ) {
    union {
        void*    Ptr;
        Ipp64u   Int;
    } dd;
    dd.Ptr = (void*)ptr;
    return dd.Int;
}
#elif (defined(_WIN32) || defined(linux32)) && !defined(_WIN32_WCE)
__INLINE
Ipp32s IPP_INT_PTR( const void* ptr ) {
    union {
        void*   Ptr;
        Ipp32s Int;
    } dd;
    dd.Ptr = (void*)ptr;
    return dd.Int;
}

__INLINE
Ipp32u IPP_UINT_PTR( const void* ptr ) {
    union {
        void*   Ptr;
        Ipp32u Int;
    } dd;
    dd.Ptr = (void*)ptr;
    return dd.Int;
}
#else
#define IPP_INT_PTR( ptr ) ( (long)(ptr) )
#define IPP_UINT_PTR( ptr ) ( (Ipp32u long)(ptr) )
#endif

#define IPP_BYTES_TO_ALIGN(ptr, align) ((-(IPP_INT_PTR(ptr)&((align)-1)))&((align)-1))

#define IPP_ALIGNED_PTR(ptr, align) (void*)( (Ipp8s*)(ptr) + (IPP_BYTES_TO_ALIGN( ptr, align )) )

#define IPP_MALLOC_ALIGNED_BYTES 32

#define IPP_MALLOC_ALIGNED_0BYTES   0
#define IPP_MALLOC_ALIGNED_1BYTES   1
#define IPP_MALLOC_ALIGNED_8BYTES   8
#define IPP_MALLOC_ALIGNED_16BYTES 16
#define IPP_MALLOC_ALIGNED_32BYTES 32

#define IPP_ALIGNED_ARRAY(align,arrtype,arrname,arrlength)\
arrtype arrname##AlignedArrBuff[(arrlength)+IPP_MALLOC_ALIGNED_##align##BYTES/sizeof(arrtype)];\
arrtype *arrname = (arrtype*)IPP_ALIGNED_PTR(arrname##AlignedArrBuff,align)

__INLINE void* GetMemory(Ipp32s arrlen, Ipp32s sizeOfElem, Ipp8s **CurPtr)
{
   void *ret;

   ret = (void*)IPP_ALIGNED_PTR(*CurPtr,sizeOfElem);
   *CurPtr += (arrlen+1)*sizeOfElem;

   return ret;
}

__INLINE void* GetAlignMemory(Ipp32s align, Ipp32s arrlen, Ipp32s sizeOfElem, Ipp8s **CurPtr)
{
   void *ret;

   ret = (void*)IPP_ALIGNED_PTR(*CurPtr,align);
   *CurPtr += (arrlen+align/sizeOfElem)*sizeOfElem;

   return ret;
}


typedef struct _ScratchMem_Obj {
    Ipp8s *base;
    Ipp8s *CurPtr;
    Ipp32s *VecPtr;
    Ipp32s   offset;
}ScratchMem_Obj;

   #define LOCAL_ALIGN_ARRAY(align,arrtype,arrname,arrlength,obj)\
      arrtype *arrname = (arrtype *)GetAlignMemory(align,arrlength,sizeof(arrtype),&(obj)->Mem.CurPtr)

   #define LOCAL_ARRAY(arrtype,arrname,arrlength,obj)\
      arrtype *arrname = (arrtype *)GetMemory(arrlength,sizeof(arrtype),&(obj)->Mem.CurPtr)

   #define LOCAL_ARRAY_FREE(arrtype,arrname,arrlength,obj)\
      arrname=NULL;\
      (obj)->Mem.CurPtr -= ((arrlength)+1)*sizeof(arrtype)

   #define LOCAL_ALIGN_ARRAY_FREE(align,arrtype,arrname,arrlength,obj)\
      arrname=NULL;\
      (obj)->Mem.CurPtr -= ((arrlength)+IPP_MALLOC_ALIGNED_##align##BYTES/sizeof(arrtype))*sizeof(arrtype)

   #define CLEAR_SCRATCH_MEMORY(obj)\
      (obj)->Mem.CurPtr = (obj)->Mem.base

   #define OPEN_SCRATCH_BLOCK(obj)\
      (obj)->Mem.VecPtr[(obj)->Mem.offset] = IPP_INT_PTR((obj)->Mem.CurPtr);\
      (obj)->Mem.offset++

   #define CLOSE_SCRATCH_BLOCK(obj)\
      (obj)->Mem.offset--;\
      (obj)->Mem.CurPtr = (Ipp8s *)(obj)->Mem.VecPtr[(obj)->Mem.offset]


#ifdef CONST
   #undef CONST
#endif

/*#if (_IPP_ARCH == _IPP_ARCH_XSC)
   #define CONST
#else
#define CONST const
#endif*/
#define CONST

#define SOCKET_SCRATCH_MEMORY_SIZE        (5120+40)
#define Media_SOCKETFUN(type,name,arg) extern type name arg

typedef enum{
    APIMedia_StsBadCodecType     =   -5,
   APIMedia_StsNotInitialized   =   -4,
   APIMedia_StsBadArgErr        =   -3,
   APIMedia_StsDeactivated      =   -2,
   APIMedia_StsErr              =   -1,
   APIMedia_StsNoErr            =    0
}APIMedia_Status;

#endif /* __SCRATCHMEM_H__ */

实现文件scratchmem.cpp:

声明一个结构体,用于内存管理

struct BufferManager{
ScratchMem_Obj      Mem;//内存管理对象
};

//内存管理器
BufferManager *G_BufferManager = NULL;

//获取定义的内存块Size

APIMedia_Status apiMedia_ScratchMemoryAlloc(Ipp32s *pCodecSize) {
    if(NULL==pCodecSize)
        return APIMedia_StsBadArgErr;
    *pCodecSize = SOCKET_SCRATCH_MEMORY_SIZE;
    return APIMedia_StsNoErr;
}

//初始化内存管理器

APIMedia_Status apiMedia_InitBuff(BufferManager* manageObj, Ipp8s *buff)
{
if(NULL==manageObj) return APIMedia_StsBadArgErr;
if(NULL==buff) return APIMedia_StsBadArgErr;

if(buff)   manageObj->Mem.base = buff; // otherwise reinit
else if (manageObj->Mem.base == NULL) return APIMedia_StsNotInitialized;
manageObj->Mem.CurPtr = manageObj->Mem.base;
manageObj->Mem.VecPtr = (Ipp32s *)(manageObj->Mem.base+SOCKET_SCRATCH_MEMORY_SIZE);

return APIMedia_StsNoErr;
}

//申请内存

Ipp8u* ippsMalloc_8u (int len){
return (Ipp8u*)malloc(len);
}

int main( int argc, char * argv[] )
{

//初始化内存池
int eSize;
Ipp8u* _buffer;
eSize = sizeof(BufferManager);
G_BufferManager = (BufferManager *)ippsMalloc_8u(eSize);

apiMedia_ScratchMemoryAlloc(&eSize);
_buffer = ippsMalloc_8u(eSize);
memset(_buffer, 0, eSize);
apiMedia_InitBuff(G_BufferManager, (Ipp8s *)_buffer);

//向内存管理器申请内存同时声明一个变量buff

char G_ReadBuffer[] = {"intel ipp is good"};

int len = sizeof(G_ReadBuffer);

LOCAL_ARRAY(Ipp8u, buff, len, G_BufferManager);
memcpy(buff, G_ReadBuffer, len);

printf("test buffer manager %s", buff);

//归还内存

LOCAL_ARRAY_FREE(Ipp8u, buff, len, G_BufferManager);

}

© 著作权归作者所有

chinacharis
粉丝 1
博文 10
码字总数 5206
作品 0
项目经理
私信 提问
深刻了解OPENCV

OpenCV是Intel资助的开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个C/C++函数的跨平台的中、高层 API。...

红薯
2008/12/10
3.1K
3
OpenCV 3.3.0 发布,改进对深度学习模块的支持

OpenCV 3.3.0 已发布,新版本大幅度改进了深度学习模块,并带来了大量的优化。 OpenCV 3.3 使用了加速的 dnn 模块,并将其移动到了主存储库,这也是首次在 OpenCV 中出现 Halide,带来了多项...

局长
2017/08/07
2.8K
1
OpenCV简介

OpenCV是Intel®开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖于...

长平狐
2013/12/25
681
2
一个从硬盘上取空间的STL内存空间分配器

最近在读侯捷写的《STL源码剖析》。 看完STL的内存空间分配器这章。在这章里,作者开玩笑的说,你甚至可以写一个直接从硬盘上取空间的配置器。我想,我确实可以写这样的分配器。然后今天就动...

costaxu
2012/12/09
0
0
计算机视觉库 - OpenCV

OpenCV 是 Intel 开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖...

匿名
2008/11/23
0
5

没有更多内容

加载失败,请刷新页面

加载更多

2019年普通高校在川招生专业及名额介绍文科 带学费

2019年普通高校在川招生专业及名额介绍文科 带学费

asdtiang
22分钟前
1
0
springCloud配置中心config配置svn(踩坑记录)(基于consul)

新建一个config Server模块; 引入如下依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId></dependency>......

为何不可1995
22分钟前
0
0
mysql相关tips(持续更新)

1.字符集:utf8mb4 mysql 5.5.3之后出来的字符集,占用1-4个字节,最大占用的字节数为4.目前这个字段主要应用在(Emoji表情)。utf8mb4兼容utf8(1-3个字节),且比utf8能表示更多的字符。什...

lara_
22分钟前
0
0
微服务开源生态报告 No.1

从关注开源,到使用开源,再到参与开源贡献,越来越多的国内开发者通过开源技术来构建业务。 截止目前,Arthas / Dubbo / ChaosBalde / Nacos / RocketMQ / Seata / Sentinel / Spring Clou...

阿里云官方博客
25分钟前
1
0
MaxCompute 费用暴涨之存储压缩率降低导致SQL输入量变大

现象:同样的SQL,每天处理的数据行数差不多,但是费用突然暴涨甚至会翻数倍。 分析: 我们先明确MaxCompute SQL后付费的计费公式:一条SQL执行的费用=扫描输入量 ️ SQL复杂度 ️ 0.3(¥/GB...

zhaowei121
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部