1. // 负责指针对齐,可能会使指针向后偏移
    2. static inline void **alignPointer(void **ptr, size_t alignment) {
    3. return (void **)((intptr_t)((unsigned char *)ptr + alignment - 1) & -alignment);
    4. }
    5. extern "C" void *MNNMemoryAllocAlign(size_t size, size_t alignment) {
    6. MNN_ASSERT(size > 0);
    7. #ifdef MNN_DEBUG_MEMORY
    8. return malloc(size);
    9. #else
    10. void **origin = (void **)malloc(size + sizeof(void *) + alignment);
    11. MNN_ASSERT(origin != NULL);
    12. if (!origin) {
    13. return NULL;
    14. }
    15. void **aligned = alignPointer(origin + 1, alignment);
    16. aligned[-1] = origin;
    17. return aligned;
    18. #endif
    19. }

    extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
    image.png
    声明为void **使得origin可以进行加法运算,origin指向指针,origin+1表示前进一个指针的大小。
    intpre_t负责将指针转换为int,进行与操作。