Linux系列:glibc程序设计规范与内存管理思想

Posted 岬淢箫声

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系列:glibc程序设计规范与内存管理思想相关的知识,希望对你有一定的参考价值。

文章目录

前言

这是一个基于lightdm、glibc、gobject、gtk、qt、glibc++、x11、wayland等多个高质量开源项目总结而来的规范。

glibc处于内核态与用户态的边界,承上启下,对用户的体验影响非常大。其在系统中的层次相当于windows系统中的vc,绝大部分Linux发行版本都依赖它。

这套程序设计规范是吸收qt的长处与gtk/boost的长处整合的程序设计规范。systemd以及其系列组件诸如d-bus、lightdm、gobject、gtk都使用的这套规范。

function不在类中叫函数,在类中叫方法。

命名规范

项目关键字大写下划线前缀
define全大写单词之间
常量const全 大写单词之间
局部变量local variable全小写词组之间基本数据类型,指针无
枚举enum首字母大写词组之间
枚举成员enum member全大写单词之间枚举名单词首字母拼接
命名空间namespace全小写词组之间
class首字母大写词组之间
成员方法class method全小写,构造、析构除外词组之间
成员变量class method全小写词组之间m_,非指针再加基本数据类型
结构体struct首字母大写词组之间
结构体成员sturct member全小写词组之间
函数function全小写词组之间
C属性函数C property全小写词组之间get_/set_
C++属性函数C++ property全小写词组之间

说明

  1. C++属性方法不加前缀,利用方法重载,get属性方法原则上加inline修饰符,代码写在H文件。
  2. 基本数据类型前缀
    1. 字符串z,包括char指针、字符串对象。字符串对象的指针不是基本数据类型
    2. 整型i,包括无符号,包括长整型、短整型和超长整型。
    3. 浮点型f,包括单精度、双精度,包括无符号,包括长浮点型。
  3. 方法或函数名、非局部变量名严禁全名就是缩写,缩写部分必须是行业公认的名词,严禁自行创造。缩写对应的注释中必须注明缩写全称。
  4. 拼音可代替英文词组,严禁拼音缩写。
  5. 局部变量允许缩写,前提是局部变量所在上下文环境代码小于30行,同时须在注释中写明全称。最好补充写明含义。
  6. 指针是复合数据类型。
  7. 不允许用一句话的全部英语单词串联起来命名一个变量。命名要直击一句话的核心,善于利用含义相似或相近的变量之间差别部分来命名变量。关键还是见多识广,知识范围不狭獈。要了解软件要实现的业务功能中的行业知识,用行业术语或关联性很强的名词命名。

版式风格

总体上采用astyle支持的--style=kr-A3格式,总结如下:

  1. 缩进用4空格,不用制表符
  2. 方法花括号独占一行,其它花括号左缩进,右独占一行
  3. 运算符左右各空一格
  4. 逗号右边空一格
  5. 左圆括号仅最外层左边空一格,右圆括号仅最外层右边空一格
  6. 一行代码最长120个字符,超长换行:
    1. 首先参数换行,对齐到方法名
    2. 其次返回值类型换行,方法名与返回值类型都对齐到最左侧
  7. 流程控制语句只有一行的情况不用花括号

以上处理仅处理字符对代码语义起作用的情况,注释、字符串值除外。

内存管理与智能指针

  1. C++内存管理模式不再适用谁使用,谁申请,谁释放原则。传统的内存管理模式适合C语言,它忽视了智能指针的作用,极大的阻碍程序设计,造成诸多不便。传统模式不支持智能指针,一句代码的逻辑要拆成三句完成,还得小心程序逻辑造臧的内存泄露问题,比如C语言中提前return造存的指针没释放的问题,C++可利用智能指针对象的生命周期在析构函数中释放。C需要goto,C++一般不使用goto。

  2. C++很多场景下不能区分管理者与使用者的逻辑边界,比如循环体中使用了继承同一个父类型的不同类型的对象的指针。构造函数增加const标记给指针类型的成员变量造成麻烦。一个类的对象对另一个类的对象的引用,如果不能明确两者的生命周期的长短,那么使用裸指针就会造成野指针的问题。这个问题延伸到多线程的场景下无解。智能指针对象造成的额外的存储和计算资源的开销对程序的整体性能的影响是有限的,可以忽略不计的。因此没有特殊情况一律禁止使用祼指针,做好第三方接口中祼指针的存储管理。

  3. 智能指针本身就是为了程序设计有别于C语言,它变革的目标就是内存管理。内存池设计更是如此。因此C++接口不要像C一样设计用于输出对象数据的入口参数。输入参数、返回值都可用的智能指针。在参数传递、返回值的接收过程中智能指针以引用的方式传递是重要的,避免不必要的指针引用计数、重复的的智能指针对象。智能指针不是指针,是包装指针的对象。对象指针不是对象,是指向对象的指针。

  4. 不涉及对象本身成员变量的修改的成员方法一律增加const标记,所有复杂数据类型的输入参数(含指针和智能指针)一律增加只读引用标记,所有输出参数增加引用标记,不增加只读标记。

关于UML

  1. 不管什么UML图,不管什么UML标准,画图重点要表达的是自己要表达的意思。
  2. 表达的范围要有边界,一般不把对第三方的引用画到图里面。
  3. 图不能比代码更复杂,细节张弛有度。对于流程图,描述重点算法为边界,其它的由一个过程框一笔带过。
  4. 不管别人说它标准不标准,自己能把它的意思讲清楚就是好图。
  5. 有一种陷阱是被各种UML标准搞得晕头转向,画图的人自己都说不清图表达的是要干什么。
作者:岬淢箫声
邮箱:zhtqs8@163.com
来源:https://caowei.blog.csdn.net/article/details/129211858

以上是关于Linux系列:glibc程序设计规范与内存管理思想的主要内容,如果未能解决你的问题,请参考以下文章

Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理

linux 下怎么优化mysql占用内存?

glibc内存管理那些事儿

十问 Linux 虚拟内存管理 (glibc)

十问 Linux 虚拟内存管理 (glibc)

从上到下看linux内存管理--glibc malloc