`
wx1569567608
  • 浏览: 63901 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

利用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);

}

转载于:https://my.oschina.net/u/2332347/blog/637844

分享到:
评论

相关推荐

    intel IPP 6.0 - 2/2

    intel的官网上已经没有这个版本的下载了。附件一共2个文件,这是第2个。附件中只有安装程序,没有license。

    intel IPP 6.0 - 1/2

    intel的官网上已经没有这个版本的下载了。附件一共2个文件,这是第一个。附件中只有安装程序,没有license。

    intel-ipp-vxworks-users-guide-7.0

    Intel IPP是一个跨平台的库,包含了大量优化的数学函数和算法,适用于图像处理、信号处理、数据压缩、加密等多个领域。本文将深入探讨在VxWorks环境下使用Intel IPP的关键知识点。 首先,Intel IPP库的核心优势在于...

    Intel IPP 信号处理函数在C++Builder中的执行效果演示及执行代码

    Intel IPP 函数库中信号处理方面的函数在C++Builder中的执行效果演示及执行代码。 注意:(1)需要安装C++Builder6(Intel IPP 函数库已经包含) (2)代码是实际执行代码(源代码TAB可见) (3)FFT测试部分可多次点击...

    Linux下Intel IPP编程环境的配置

    首先需要了解的是,Intel IPP提供的是一系列已经优化的函数,可以作为软件开发中的一个中间层来使用。由于这些函数针对Intel处理器进行了高度优化,因此它们可以提高软件的执行效率。但是,开发者需要注意的是,使用...

    intel-IPP.pdf

    1. **IPP简介**:Intel IPP是一个跨平台的库,它包含了一系列高度优化的函数,这些函数针对Intel处理器进行了专门的硬件优化,能够在多核CPU上实现最佳性能。IPP支持多种编程语言,包括C和C++,并且适用于Windows、...

    Intel IPP V8.1信号处理

    Intel IPP V8.1作为该系列的一个重要版本,其更新包含了多方面的改进和新特性,旨在提供更高效、更全面的多媒体处理支持。 ##### 1. 性能提升 - **优化算法**:V8.1版本对核心算法进行了深度优化,尤其是在信号...

    如何下载 Intel Integrated Performance Primitives –intel IPP

    ### 如何下载Intel Integrated Performance Primitives (Intel IPP) Intel Integrated Performance Primitives(Intel IPP)是Intel提供的一套高性能多媒体和信号处理库,旨在优化数据处理性能,尤其在图像、视频、...

    Intel IPP集成编码器样例使用说明(英文)

    Intel IPP(Integrated Performance Primitives)是一个高性能的软件库,提供了一系列的底层优化程序和函数,以支持多媒体处理、图像处理、数字信号处理、数据压缩等应用的加速。Intel IPP样例使用说明文档向开发者...

    ipp-crypto-develop

    "ipp-crypto-develop" 是一个专门针对Intel Performance Primitives (IPP) 加密库的开发环境。IPP是由Intel公司提供的一个高效、跨平台的软件库,主要用于执行各种密码学和数据安全算法,如AES(高级加密标准)、RSA...

    intel ipp 编解码器

    总之,Intel IPP编解码器是一个强大的工具,专为优化在Intel平台上运行的H264视频处理。它的功能包括编码和解码H264视频,并能够将视频数据转换为YUV格式,适用于各种媒体处理需求。通过提供的console应用程序,用户...

    intel ipp c++视觉库

    Intel IPP (Integrated Performance Primitives) 是一套高度优化的C++库,主要用于图像处理、信号处理、数学运算以及加密解密等任务。它被设计为在Intel处理器上运行时能实现最佳性能,尤其在多核系统中表现优异。...

    intel ipp库使用文档最新

    intel ipp库使用文档最新Intel® Integrated Performance Primitives Developer Reference, Volume 1: Signal Processing Intel® Integrated Performance Primitives (Intel® IPP) includes content from several ...

    w_ipp-samples_p_7.1.1.013.zip

    Intel IPP(Intel Integrated Performance Primitives)是一套高度优化的库函数,主要面向计算密集型任务,如信号处理、图像处理、数学运算以及数据压缩等。它提供了跨平台的API,支持多种处理器架构,包括Intel x86...

    ipp-8070.pdf

    IPP-8047 IPP-8061 IPP-8033 IPP-8038 IPP-8071 IPP-8059 IPP-8032 IPP-8000

    x264-intel IPP 比较.rar

    《x264与Intel IPP编码性能比较》 在视频编码领域,x264和Intel IPP是两个备受关注的工具。它们各自有着独特的特性和优势,被广泛应用于高清视频编码和流媒体服务中。本篇文章将深入探讨x264和Intel IPP在H.264编码...

    JPEG.rar_IPP_intel_jpeg codec linux_jpeg intel_linux jpeg

    标题中的"JPEG.rar_IPP_intel_jpeg_codec_linux_jpeg_intel_linux/jpeg"揭示了这个压缩包的内容主要涉及Intel IPP(Integrated Performance Primitives)优化的JPEG编解码器,适用于Linux操作系统。Intel IPP是一个...

    intel ipp软件包

    这个软件包是Intel公司为开发者提供的一个强大工具,旨在提高应用程序在Intel处理器上的性能。 Intel IPP库包含了大量预先编译的函数,这些函数使用了最新的指令集如SSE、AVX、AVX2、AVX-512等,以充分利用现代...

    intel ipp6.1.6sample

    - Intel IPP是一个高度优化的软件库,包含多种处理函数,用于提高应用程序的性能。 - 它支持多种编程语言,包括C和C++,并且可在Windows、Linux和Mac OS X等操作系统上运行。 - IPP库分为多个领域,如数学运算...

    IPP使用手册,intel

    Intel IPP库所包含函数的使用说明.  Intel® Integrated Performance Primitives (Intel® IPP) is an extensive library of ready-to-use, domain-specific functions that are highly optimized for diverse ...

Global site tag (gtag.js) - Google Analytics