1. bool FileLoader::read()
    2. {
    3. auto block = MNNMemoryAllocAlign(gCacheSize, MNN_MEMORY_ALIGN_DEFAULT);
    4. if (nullptr == block)
    5. {
    6. MNN_PRINT("Memory Alloc Failed\n");
    7. return false;
    8. }
    9. auto size = fread(block, 1, gCacheSize, mFile);
    10. mTotalSize = size;
    11. mBlocks.push_back(std::make_pair(size, block));
    12. while (size == gCacheSize)
    13. {
    14. block = MNNMemoryAllocAlign(gCacheSize, MNN_MEMORY_ALIGN_DEFAULT);
    15. if (nullptr == block)
    16. {
    17. MNN_PRINT("Memory Alloc Failed\n");
    18. return false;
    19. }
    20. size = fread(block, 1, gCacheSize, mFile);
    21. if (size > gCacheSize)
    22. {
    23. MNN_PRINT("Read file Error\n");
    24. MNNMemoryFreeAlign(block);
    25. return false;
    26. }
    27. mTotalSize += size;
    28. mBlocks.push_back(std::make_pair(size, block));
    29. }
    30. if (ferror(mFile))
    31. {
    32. return false;
    33. }
    34. return true;
    35. }

    FileLoader按块读取文件,将每块的大小及指针保存在mBlocks中。

    1. bool FileLoader::merge(AutoStorage<uint8_t> &buffer)
    2. {
    3. buffer.reset((int)mTotalSize);
    4. if (buffer.get() == nullptr)
    5. {
    6. MNN_PRINT("Memory Alloc Failed\n");
    7. return false;
    8. }
    9. auto dst = buffer.get();
    10. int offset = 0;
    11. for (auto iter : mBlocks)
    12. {
    13. ::memcpy(dst + offset, iter.second, iter.first);
    14. offset += iter.first;
    15. }
    16. return true;
    17. }

    AutoStorage负责进行自我内存存储,通过进行块合并,合并到AutoStorage &buffer中。