TensorComprehensions 项目 C++ 编码规范详解
前言
TensorComprehensions 是一个基于 C++ 开发的张量计算框架,其代码库采用了严格的编码规范来保证代码质量和可维护性。本文将深入解析该项目的 C++ 编码规范,帮助开发者理解如何编写符合项目要求的代码。
文件组织规范
头文件与实现文件
项目中每个 .cc
实现文件都必须有对应的 .h
头文件,且名称相同。头文件应包含所有公共接口的声明,并遵循以下原则:
- 头文件中的声明(类、枚举、函数、常量等)必须全部文档化
- 避免创建仅用于包含其他头文件的大型头文件
- 使用
#pragma once
作为包含保护机制
包含文件规则
遵循"包含你所使用的"(IWYU)原则:
- 在
.cpp
文件中,首先包含对应的.h
文件 - 将包含文件分组(标准库、外部项目、项目内部)
- 每组内按字母顺序排列
- 项目内部头文件使用双引号,其他使用尖括号
示例:
#include "module/header.h"
#include <vector>
#include <string>
#include <external/library.h>
#include "module/other_header.h"
类与结构体设计
类定义规范
- 使用
struct
和class
时都显式指定访问修饰符 - 单参数构造函数必须使用
explicit
关键字 - 优先使用公共成员变量而非简单的 getter/setter
- 成员声明顺序:
- 友元类
- 嵌套类、枚举、类型定义
- 构造函数、析构函数
- 成员函数
- 常量和静态成员
- 所有实例数据成员
内联函数
- 鼓励对短小函数使用内联
- 对于紧凑接口类,直接在类定义中实现内联函数
- 对于复杂API类,将内联实现放在
-inl.h
文件中 - 特殊情况可使用
-defs.h
文件存放特定调用者需要的定义
命名规范
基本命名规则
- 变量:
lowerCamelCase
或lower_case_with_underscores
- 静态变量:前缀
s_
(如s_funcVec
) - 常量:前缀
k
加CamelCase
(如kInvalidHandle
) - 类成员:
lowerCamelCase
或lower_case_with_underscores
,私有成员加_
后缀 - 函数:
lowerCamelCase
(接口兼容时遵循原有命名) - 类:
UpperCamelCase
- 命名空间:
lowercase
或lower_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
,禁止旧式枚举
内存管理
遵循以下所有权规则:
- 禁止使用裸指针传递所有权
- 所有权转移时使用
shared_ptr
或unique_ptr
- 不涉及所有权变更的函数应使用
const
指针或引用 - 工厂函数返回
unique_ptr
- 成员可能比类生命周期长时使用
shared_ptr
兼容性考虑
项目使用 gcc-4.8
兼容的 C++11 子集,特别注意:
- 避免使用
std::regex
(gcc-4.8 支持不完善) - 不使用 C++14 及更高版本特性
总结
TensorComprehensions 的编码规范在保证代码质量的同时,也注重开发效率和可读性。规范既包含通用的最佳实践,也有针对项目特性的特殊约定。开发者应理解这些规范背后的设计理念,而不仅仅是机械遵守规则。
通过遵循这些规范,可以确保代码库保持一致的风格,降低维护成本,并方便新贡献者快速上手。对于现有代码的修改,也应尽量遵循这些规范,保持代码风格的一致性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考