TensorComprehensions 项目 C++ 编码规范详解

TensorComprehensions 项目 C++ 编码规范详解

前言

TensorComprehensions 是一个基于 C++ 开发的张量计算框架,其代码库采用了严格的编码规范来保证代码质量和可维护性。本文将深入解析该项目的 C++ 编码规范,帮助开发者理解如何编写符合项目要求的代码。

文件组织规范

头文件与实现文件

项目中每个 .cc 实现文件都必须有对应的 .h 头文件,且名称相同。头文件应包含所有公共接口的声明,并遵循以下原则:

  • 头文件中的声明(类、枚举、函数、常量等)必须全部文档化
  • 避免创建仅用于包含其他头文件的大型头文件
  • 使用 #pragma once 作为包含保护机制

包含文件规则

遵循"包含你所使用的"(IWYU)原则:

  1. .cpp 文件中,首先包含对应的 .h 文件
  2. 将包含文件分组(标准库、外部项目、项目内部)
  3. 每组内按字母顺序排列
  4. 项目内部头文件使用双引号,其他使用尖括号

示例:

#include "module/header.h"

#include <vector>
#include <string>

#include <external/library.h>

#include "module/other_header.h"

类与结构体设计

类定义规范

  • 使用 structclass 时都显式指定访问修饰符
  • 单参数构造函数必须使用 explicit 关键字
  • 优先使用公共成员变量而非简单的 getter/setter
  • 成员声明顺序:
    1. 友元类
    2. 嵌套类、枚举、类型定义
    3. 构造函数、析构函数
    4. 成员函数
    5. 常量和静态成员
    6. 所有实例数据成员

内联函数

  • 鼓励对短小函数使用内联
  • 对于紧凑接口类,直接在类定义中实现内联函数
  • 对于复杂API类,将内联实现放在 -inl.h 文件中
  • 特殊情况可使用 -defs.h 文件存放特定调用者需要的定义

命名规范

基本命名规则

  • 变量lowerCamelCaselower_case_with_underscores
  • 静态变量:前缀 s_(如 s_funcVec
  • 常量:前缀 kCamelCase(如 kInvalidHandle
  • 类成员lowerCamelCaselower_case_with_underscores,私有成员加 _ 后缀
  • 函数lowerCamelCase(接口兼容时遵循原有命名)
  • UpperCamelCase
  • 命名空间lowercaselower_case_with_underscores

特殊约定

  • 优先使用 UpperCamelCase 形式的缩写(如 TcCompiler 而非 TCCompiler
  • 使用 Id 而非 ID(如 IslId 而非 ISLID

代码格式化

基本格式规则

  • 使用空格缩进,每级2个空格
  • 行宽不超过80字符
  • 禁止行尾空格
  • 指针/引用声明时,*& 靠近类型
  • 每行只声明一个变量

函数格式

短函数签名:

void Func::appendParam(bool ref, const ParamInfo& info) {}

长函数签名:

void Function::withManyParameters(
    Type first,
    Type second,
    Type third) {
  // 函数体
}

控制结构

基本格式:

if (condition == nullptr) {
  handleError();
  return;
}

单行形式(必须保留大括号):

if (count == 0) { reset(); }

表达式格式

  • 二元运算符两侧各留一个空格(.-> 除外)
  • 避免多余括号,除非提高可读性
  • 长表达式在运算符后换行,与当前缩进级别对齐

示例:

if (longCondition1 &&
    longCondition2 &&
    (subCondition1 || subCondition2)) {
  // 代码块
}

现代C++特性使用

命名空间

  • 所有代码应在 namespace tc
  • 大型子模块可使用嵌套命名空间(如 tc::polyhedral
  • 头文件中避免 using namespace
  • 实现文件中可酌情使用以提高可读性

枚举

只使用 enum class,禁止旧式枚举

内存管理

遵循以下所有权规则:

  1. 禁止使用裸指针传递所有权
  2. 所有权转移时使用 shared_ptrunique_ptr
  3. 不涉及所有权变更的函数应使用 const 指针或引用
  4. 工厂函数返回 unique_ptr
  5. 成员可能比类生命周期长时使用 shared_ptr

兼容性考虑

项目使用 gcc-4.8 兼容的 C++11 子集,特别注意:

  • 避免使用 std::regex(gcc-4.8 支持不完善)
  • 不使用 C++14 及更高版本特性

总结

TensorComprehensions 的编码规范在保证代码质量的同时,也注重开发效率和可读性。规范既包含通用的最佳实践,也有针对项目特性的特殊约定。开发者应理解这些规范背后的设计理念,而不仅仅是机械遵守规则。

通过遵循这些规范,可以确保代码库保持一致的风格,降低维护成本,并方便新贡献者快速上手。对于现有代码的修改,也应尽量遵循这些规范,保持代码风格的一致性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌朦慧Richard

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值