格式化工具

在新增文件时,使用clang-format调整代码风格:

在修改文件时,使用git-clang-format调整新增部分的代码风格:

  1. git-clang-format

代码风格

对于C、C++、Objective-C代码,我们使用Google代码风格。但是对下列项目作出调整:

在C、C++和ObjC中使用驼峰命名法,如CityCatbigDoghouse

所有需要对外暴露的函数、类,都需要使用MNN_PUBLIC标记。

最佳实践

临近释放原则

为降低内存泄露风险,申请临时内存和释放内存宜在相邻代码块内实现,即,应使用智能指针或AutoStorage类。

对于外部入参,应明确判定入参有效性,如:

对于内部入参,宜使用MNN_ASSERT避免问题代码的产生,如:

  1. void copyFloats(const float* input, float* output, int size) {
  2. MNN_ASSERT(NULL != input);
  3. MNN_ASSERT(NULL != output);
  4. for (int i = 0; i < size; ++i) {
  5. }
  6. }

注释

对于所有非Op头文件:

  1. class需要注释说明类的用途;
  2. 所有非overridepublic方法需要通过注释说明方法、各参数的用途和返回值信息(若有);
  3. 所有public成员变量(一般为结构体成员)需说明其用途;

示例:

  1. /**
  2. * @param param param description
  3. * @return return value description
  4. */
  5. int example(int param) {
  6. }

特殊限制

出于便于性能分析的理由,除引入的三方代码外,MNN代码需遵循:

  1. class禁止运算符重载
  2. class禁止实现拷贝构造函数、重载赋值运算符
  3. struct禁止自定义构造函数

出于控制库文件大小的理由,除引入的三方代码外,MNN代码需遵循:

  1. 不允许使用stream,如cout/cin、 ifstream/ofstream、 istringstream/ostringstream等
  2. 不允许使用C++异常机制,即try/catch/throw

汇编

  1. 所有汇编都需要有C语言等价实现,编译时,通过宏选择平台对应的汇编实现或C语言实现
  2. 严格按照ARM标准手册使用寄存器,如armv7a上q4 - q7使用后必须复原,armv8上v8 - v15 使用后必须复原