利用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);
}
相关推荐
intel的官网上已经没有这个版本的下载了。附件一共2个文件,这是第一个。附件中只有安装程序,没有license。
intel的官网上已经没有这个版本的下载了。附件一共2个文件,这是第2个。附件中只有安装程序,没有license。
Intel IPP 函数库中信号处理方面的函数在C++Builder中的执行效果演示及执行代码。 注意:(1)需要安装C++Builder6(Intel IPP 函数库已经包含) (2)代码是实际执行代码(源代码TAB可见) (3)FFT测试部分可多次点击...
intel ipp库使用文档最新Intel® Integrated Performance Primitives Developer Reference, Volume 1: Signal Processing Intel® Integrated Performance Primitives (Intel® IPP) includes content from several ...
intel ipp 编解码器 支持h264格式(不带splitter信息)到yuv格式转换。
IPP-8047 IPP-8061 IPP-8033 IPP-8038 IPP-8071 IPP-8059 IPP-8032 IPP-8000
Intel Integrated Performance Primitives for VxWorks* OS 注意,不是Windows系统,而是VxWorks系统下的帮助文档
Intel IPP开发包对应的开发手册,内容IPP开发包大量图像处理API的用法描述,PDF格式,图像开发人员必备。。
intel ipp 软件包 intel ipp 软件包
Intel® Integrated Performance Primitives Samples,intel ipp集成媒体编解码器库使用案例说明
Intel IPP 8.1 信号处理 说明文档
开发包安装后,在安装目录下的tools\runtime目录中有一个可二次分发的安装,该程序默认会根据CPU型号仅安装合适的运行时库,但这可以通过命令行来控制;参考该目录下的“readme.htm”。运行时库的目的安装位置为...
专业版把高效的编译器和Intel® Threading Building Blocks (Intel® TBB), Intel® Integrated Performance Primitives (Intel® IPP) and Intel® Math Kernel Library (Intel® MKL)整合到了一起。虽然这些库也...
PP - “Intel Integrated Performance Primitives” (Intel IPP )是一套跨平台的软件函数库,他提供了广泛的多媒体功能:音频解码器(例如: H263 、 MPEG-4 )、图像处理 (JPEG) 、信号处理、语音压缩(例如: G...
ipp-crypto-develop,Win10 系统下安装运行通过,可以使用
x264-intel IPP 比较.rar
Intel IPP 示例代码,供入门学习
IPP-userguide-linux-windows-ia32-ia64 IPP-userguide-linux-windows-ia32-ia64
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 ...
Intel® IPP 7.1 Samples