Linux系列:glibc程序设计规范与内存管理思想
文章目录
- 前言
- 命名规范
- 说明
- 版式风格
- 内存管理与智能指针
- 关于UML
前言
这是一个基于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 | 全小写 | 词组之间 | 无 |
说明
C++属性方法不加前缀,利用方法重载,get属性方法原则上加inline修饰符,代码写在H文件。- 基本数据类型前缀
- 字符串z,包括char指针、字符串对象。字符串对象的指针不是基本数据类型
- 整型i,包括无符号,包括长整型、短整型和超长整型。
- 浮点型f,包括单精度、双精度,包括无符号,包括长浮点型。
- 方法或函数名、非局部变量名严禁全名就是缩写,缩写部分必须是行业公认的名词,严禁自行创造。缩写对应的注释中必须注明缩写全称。
- 拼音可代替英文词组,严禁拼音缩写。
- 局部变量允许缩写,前提是局部变量所在上下文环境代码小于30行,同时须在注释中写明全称。最好补充写明含义。
- 指针是复合数据类型。
- 不允许用一句话的全部英语单词串联起来命名一个变量。命名要直击一句话的核心,善于利用含义相似或相近的变量之间差别部分来命名变量。关键还是见多识广,知识范围不狭獈。要了解软件要实现的业务功能中的行业知识,用行业术语或关联性很强的名词命名。
版式风格
总体上采用astyle支持的--style=kr或-A3格式,总结如下:
- 缩进用4空格,不用制表符
- 方法花括号独占一行,其它花括号左缩进,右独占一行
- 运算符左右各空一格
- 逗号右边空一格
- 左圆括号仅最外层左边空一格,右圆括号仅最外层右边空一格
- 一行代码最长120个字符,超长换行:
- 首先参数换行,对齐到方法名
- 其次返回值类型换行,方法名与返回值类型都对齐到最左侧
- 流程控制语句只有一行的情况不用花括号
以上处理仅处理字符对代码语义起作用的情况,注释、字符串值除外。
内存管理与智能指针
-
C++内存管理模式不再适用谁使用,谁申请,谁释放原则。传统的内存管理模式适合C语言,它忽视了智能指针的作用,极大的阻碍程序设计,造成诸多不便。传统模式不支持智能指针,一句代码的逻辑要拆成三句完成,还得小心程序逻辑造臧的内存泄露问题,比如C语言中提前return造存的指针没释放的问题,C++可利用智能指针对象的生命周期在析构函数中释放。C需要goto,C++一般不使用goto。
-
C++很多场景下不能区分管理者与使用者的逻辑边界,比如循环体中使用了继承同一个父类型的不同类型的对象的指针。构造函数增加const标记给指针类型的成员变量造成麻烦。一个类的对象对另一个类的对象的引用,如果不能明确两者的生命周期的长短,那么使用裸指针就会造成野指针的问题。这个问题延伸到多线程的场景下无解。智能指针对象造成的额外的存储和计算资源的开销对程序的整体性能的影响是有限的,可以忽略不计的。因此没有特殊情况一律禁止使用祼指针,做好第三方接口中祼指针的存储管理。
-
智能指针本身就是为了程序设计有别于C语言,它变革的目标就是内存管理。内存池设计更是如此。因此C++接口不要像C一样设计用于输出对象数据的入口参数。输入参数、返回值都可用的智能指针。在参数传递、返回值的接收过程中智能指针以引用的方式传递是重要的,避免不必要的指针引用计数、重复的的智能指针对象。智能指针不是指针,是包装指针的对象。对象指针不是对象,是指向对象的指针。
-
不涉及对象本身成员变量的修改的成员方法一律增加const标记,所有复杂数据类型的输入参数(含指针和智能指针)一律增加只读引用标记,所有输出参数增加引用标记,不增加只读标记。
关于UML
- 不管什么UML图,不管什么UML标准,画图重点要表达的是自己要表达的意思。
- 表达的范围要有边界,一般不把对第三方的引用画到图里面。
- 图不能比代码更复杂,细节张弛有度。对于流程图,描述重点算法为边界,其它的由一个过程框一笔带过。
- 不管别人说它标准不标准,自己能把它的意思讲清楚就是好图。
- 有一种陷阱是被各种UML标准搞得晕头转向,画图的人自己都说不清图表达的是要干什么。
| 作者: | 岬淢箫声 |
| 邮箱: | zhtqs8@163.com |
| 来源: | https://caowei.blog.csdn.net/article/details/129211858 |
相关文章:
Linux系列:glibc程序设计规范与内存管理思想
文章目录前言命名规范说明版式风格内存管理与智能指针关于UML前言 这是一个基于lightdm、glibc、gobject、gtk、qt、glibc、x11、wayland等多个高质量开源项目总结而来的规范。 glibc处于内核态与用户态的边界,承上启下,对用户的体验影响非常大。其在系…...
Redis 集群
文章目录一、集群简介二、Redis集群结构设计🍉2.1 数据存储设计🍉2.2 内部通信设计三、cluster 集群结构搭建🍓3-1 cluster配置 .conf🍓3-2 cluster 节点操作命令🍓3-3 redis-trib 命令🍓3-4 搭建 3主3从结…...
EF 框架的简介、发展历史;ORM框架概念
一、EF 框架简介EF 全称是 EntityFramework 。Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。ORM框架(Object Relational Mapping) 翻译过来就是对象关系映射。如果不用ORM框架,我们一般这样…...
注解原理剖析与实战
一、注解及其原理 1.注解的基本概念 注解,可以看作是对 一个类/方法的一个扩展的模版,每个类/方法按照注解类中的规则,来为类/方法注解不同的参数,在用到的地方可以得到不同的类/方法中注解的各种参数与值。 从JDK5开始ÿ…...
《STL源码剖析》理解之将类成员函数和for_each等算法结合
类成员函数可以通过函数适配器(function adapters)包装成一个仿函数(重载了operator()的类),将其搭配于STL算法一起使用。#include <algorithm> #include <functional> #include <vector> #include <iostream>using namespace std;class In…...
如何构建应用标准化体系
标准化的过程实际上就是对运维对象的识别和建模过程。形成统一的对象模型后,各方在统一的认识下展开有效协作,然后针对不同的运维对象,再抽取出它们所对应的运维场景,接下来才是运维场景的自动化实现。 在标准化的过程中…...
【RabbitMQ笔记03】消息队列RabbitMQ七种模式之WorkQueues工作队列模式
这篇文章,主要介绍消息队列RabbitMQ七种模式之WorkQueues工作队列模式。 目录 一、工作队列模式 1.1、什么是Work Queues模式 1.2、工作队列模式的使用 (1)引入依赖 (2)编写生产者 (3)编写…...
认识html
1.html的特点先看一段简单的html代码<html><head></head><body>hello world</body> </html>如果将这段带有这段代码的.html文件拉进浏览器中,就会出现一个页面,内容就是hello world,如下图:由上面的代码,我们可以了解到一些html代码的特点…...
在外包公司熬了 3 年终于进了字节,竭尽全力....
其实两年前校招的时候就往字节投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…...
绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)
目录前言一、关于STM32 I/O端口位的基本结构讲解二、模拟I2C编写前的需知道的知识1、I2C简介2、根据时序编写模拟I2C程序重要的两点Ⅰ、主机发送数据给从机时的时序控制Ⅱ、主机接收来自从机的数据时的时序控制Ⅲ、完整的I2C时序图(按写程序的思想分割时序ÿ…...
2023年全国最新工会考试精选真题及答案5
百分百题库提供工会考试试题、工会考试预测题、工会考试真题、工会证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 1.企业工会委员会实行(),重要问题须经(&#x…...
一文2000字手把手教你自动化测试Selenium+pytest+数据驱动
主流自动化框架 selenium :web端自动化框架 ,(行业里面最核心的框架) appium :手机app端框架 requests :接口测试 selenium 工具类封装 selenium提供了很多方法供我们去完成网页元素的操作, …...
windows安装Ubuntu子系统以及图形化界面记录
文章目录1. windows环境设置2. 开始安装3. ubuntu使用3.1 启动和退出 Linux 子系统3.2 安装位置3.3 更换源4. 安装图形化界面4.1 安装VcXsrv4.2 安装桌面环境(1)方法1:VcXsrv Gnome(2)方法2:VcXsrv Xfce4…...
通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码
文章目录1、什么是DES2、DES的基本概念3、DES的加密流程4、DES算法步骤详解4.1 初始置换(Initial Permutation,IP置换)4.2 加密轮次4.3 F轮函数4.3.1 拓展R到48位4.3.2 子密钥K的生成4.3.3 当前轮次的子密钥与拓展的48位R进行异或运算4.3.4 S盒替换(Subs…...
为多态基类声明virtual析构函数
我们知道,有时会让一个基类指针指向用 new 运算符动态生成的派生类对象(类似接口的作用);同时,用 new 运算符动态生成的对象都是通过 delete 指向它的指针来释放的。如果一个基类指针指向用 new 运算符动态生成的派生类…...
啊哈 算法读书笔记 第 2 章 栈、队列、链表
第 2 章 栈、队列、链表 目录 第 2 章 栈、队列、链表 队列: 解密回文——栈 纸牌游戏: 链表 模拟链表 队列: 首先将第 1 个数删除,紧接着将第 2 个数放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串…...
Git ---- IDEA 集成 Git
Git ---- IDEA 集成 Git1. 配置 Git 忽略文件2. 定位 Git 程序3. 初始化本地库4. 添加到暂存区5. 提交到本地库6. 切换版本7. 创建分支8. 切换分支9. 合并分支10. 解决冲突1. 配置 Git 忽略文件 1. Eclipse 特定文件 2. IDEA 特定文件 3. Maven 工程的 target 目录 问题1…...
【LeetCode 704】【Go】二分查找
二分查找题解 一、碎碎念 从本周开始,重新更新刷题记录了哈。 基于费曼学习法的原理,最好的输入是输出,所以与大家分享。 鉴于目前这个糟糕的市场环境,还是要练好自己的基本技术,万一那天就被迫 N 1了,你…...
【代码随想录训练营】【Day23】第六章|二叉树|669. 修剪二叉搜索树 |108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树
修剪二叉搜索树 题目详细:LeetCode.669 做这道题之前建议先看视频讲解,没有想象中那么复杂:代码随想录—修剪二叉搜索树 由题可知,需要删除节点值不在区间内的节点,所以可以得到三种情况: 情况一&#…...
CV——day78 读论文:通过静态背景构建扩展低通道路边雷达的探测距离(目标是规避风险)
Extending the Detection Range for Low-Channel Roadside LiDAR by Static Background Construction 通过静态背景构建扩展低通道路边雷达的探测距离I. INTRODUCTIONII. RELATED WORKA. LiDAR-Based 3-D Vehicle and Road User DetectionB. LiDAR Data Background FilteringC.…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
