当前位置: 首页 > news >正文

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全小写词组之间

说明

  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程序设计规范与内存管理思想

文章目录前言命名规范说明版式风格内存管理与智能指针关于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开始&#xff…...

《STL源码剖析》理解之将类成员函数和for_each等算法结合

类成员函数可以通过函数适配器(function adapters)包装成一个仿函数(重载了operator()的类)&#xff0c;将其搭配于STL算法一起使用。#include <algorithm> #include <functional> #include <vector> #include <iostream>using namespace std;class In…...

如何构建应用标准化体系

标准化的过程实际上就是对运维对象的识别和建模过程。形成统一的对象模型后&#xff0c;各方在统一的认识下展开有效协作&#xff0c;然后针对不同的运维对象&#xff0c;再抽取出它们所对应的运维场景&#xff0c;接下来才是运维场景的自动化实现。 在标准化的过程中&#xf…...

【RabbitMQ笔记03】消息队列RabbitMQ七种模式之WorkQueues工作队列模式

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之WorkQueues工作队列模式。 目录 一、工作队列模式 1.1、什么是Work Queues模式 1.2、工作队列模式的使用 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者 &#xff08;3&#xff09;编写…...

认识html

1.html的特点先看一段简单的html代码<html><head></head><body>hello world</body> </html>如果将这段带有这段代码的.html文件拉进浏览器中,就会出现一个页面,内容就是hello world,如下图:由上面的代码,我们可以了解到一些html代码的特点…...

在外包公司熬了 3 年终于进了字节,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…...

绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)

目录前言一、关于STM32 I/O端口位的基本结构讲解二、模拟I2C编写前的需知道的知识1、I2C简介2、根据时序编写模拟I2C程序重要的两点Ⅰ、主机发送数据给从机时的时序控制Ⅱ、主机接收来自从机的数据时的时序控制Ⅲ、完整的I2C时序图&#xff08;按写程序的思想分割时序&#xff…...

2023年全国最新工会考试精选真题及答案5

百分百题库提供工会考试试题、工会考试预测题、工会考试真题、工会证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题 1.企业工会委员会实行&#xff08;&#xff09;&#xff0c;重要问题须经&#xff08;&#x…...

一文2000字手把手教你自动化测试Selenium+pytest+数据驱动

主流自动化框架 selenium &#xff1a;web端自动化框架 &#xff0c;&#xff08;行业里面最核心的框架&#xff09; appium &#xff1a;手机app端框架 requests &#xff1a;接口测试 selenium 工具类封装 selenium提供了很多方法供我们去完成网页元素的操作&#xff0c; …...

windows安装Ubuntu子系统以及图形化界面记录

文章目录1. windows环境设置2. 开始安装3. ubuntu使用3.1 启动和退出 Linux 子系统3.2 安装位置3.3 更换源4. 安装图形化界面4.1 安装VcXsrv4.2 安装桌面环境&#xff08;1&#xff09;方法1&#xff1a;VcXsrv Gnome&#xff08;2&#xff09;方法2&#xff1a;VcXsrv Xfce4…...

通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码

文章目录1、什么是DES2、DES的基本概念3、DES的加密流程4、DES算法步骤详解4.1 初始置换(Initial Permutation&#xff0c;IP置换)4.2 加密轮次4.3 F轮函数4.3.1 拓展R到48位4.3.2 子密钥K的生成4.3.3 当前轮次的子密钥与拓展的48位R进行异或运算4.3.4 S盒替换&#xff08;Subs…...

为多态基类声明virtual析构函数

我们知道&#xff0c;有时会让一个基类指针指向用 new 运算符动态生成的派生类对象&#xff08;类似接口的作用&#xff09;&#xff1b;同时&#xff0c;用 new 运算符动态生成的对象都是通过 delete 指向它的指针来释放的。如果一个基类指针指向用 new 运算符动态生成的派生类…...

啊哈 算法读书笔记 第 2 章 栈、队列、链表

第 2 章 栈、队列、链表 目录 第 2 章 栈、队列、链表 队列&#xff1a; 解密回文——栈 纸牌游戏&#xff1a; 链表 模拟链表 队列&#xff1a; 首先将第 1 个数删除&#xff0c;紧接着将第 2 个数放到这串数的末尾&#xff0c;再将第 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】二分查找

二分查找题解 一、碎碎念 从本周开始&#xff0c;重新更新刷题记录了哈。 基于费曼学习法的原理&#xff0c;最好的输入是输出&#xff0c;所以与大家分享。 鉴于目前这个糟糕的市场环境&#xff0c;还是要练好自己的基本技术&#xff0c;万一那天就被迫 N 1了&#xff0c;你…...

【代码随想录训练营】【Day23】第六章|二叉树|669. 修剪二叉搜索树 |108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树

修剪二叉搜索树 题目详细&#xff1a;LeetCode.669 做这道题之前建议先看视频讲解&#xff0c;没有想象中那么复杂&#xff1a;代码随想录—修剪二叉搜索树 由题可知&#xff0c;需要删除节点值不在区间内的节点&#xff0c;所以可以得到三种情况&#xff1a; 情况一&#…...

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.…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...