operation systemGammaPerf

ncnn fastMalloc函数 内存对齐式分配 代码浅析

2019-02-02  本文已影响87人  Chriszzzz

1 起因

工作需要,简单熟悉下ncnn(腾讯的一个神经网络前向计算框架)相关的源码。看到有关内存对齐的一段代码,忍不住分析一番。

涉及到C语言的指针、内存,总会让人有些头大,但我们又不得不承认,它也确是非常有趣。

2 源码 & Demo & 问题

nccc git地址
https://github.com/Tencent/ncnn
简单Demo
allocator.h 中的 alignPtrfastMalloc 两个函数提取出来,做一个简单的调用Demo,具体如下。

Demo & 问题

如果对上述问题感兴趣,你可以继续往下看了:)

3 分析

Step n 和 第2部分代码中的是一一对应的哦!

3.1 Step1 : 分配内存

unsigned char* udata = (unsigned char*)malloc(size + sizeof(void*) + MALLOC_ALIGN);
内存分配

3.2 Step2 : 对其方法调用分析

unsigned char** adata = alignPtr((unsigned char**)udata + 1, MALLOC_ALIGN);
关于udata+1

Step3 : 实现偏移

template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)) {
    return (_Tp*)(((size_t)ptr + n-1) & -n);
}
实现地址偏移

Step4 : 设置未对齐前的内存地址

adata[-1] = udata;
设置对齐前内存地址
static inline void fastFree(void* ptr) {
    if (ptr) {
        unsigned char* udata = ((unsigned char**)ptr)[-1];
        free(udata);
    }
}

Step5 : 返回用户关注的内存地址

return adata;
image.png

用户拿到的内存指针指向的是数据的开始位置哦!

4 草草结束

完~

上一篇 下一篇

猜你喜欢

热点阅读