自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

守望的博客-编程珠玑

Linux/C/C++/数据结构与算法/工具/资源,关注公众号编程珠玑,第一时间获取更多原创技术文章

  • 博客(171)
  • 收藏
  • 关注

原创 Linux/C/C++ 不可错过的好书

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言经常有读者让我推荐书籍,这次我就把我私藏的计算机书单分享给你们!不过由于时间匆忙,不会进行更加详细的介绍。以下大部分书籍可在公众号后台恢复关键字获取电子版,不过建议购买纸质书。声明由于每个人的情况不一样,推荐的书并不一定适合你,也不一定适合当前阶段的你,有的书籍可能存在内容重复,所以...

2019-10-24 19:57:00 24761 34

原创 学Linux到底学什么

来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/09/25/14472.html前言​我们常常听到很多人说要学学Linux或者被人告知说应该学学Linux,那么学Linux到底要学什么?为什么要学Linux在回答学什么之前,我们先看看为什么要学。首先我们需要认识到的是,很多服务器使用的是Linux系统,而作为服务器应...

2019-09-27 21:08:37 36166 64

原创 这样设计API,让接口更加健壮!

原文链接:https://www.yanbinghu.com/2020/11/07/61329.html之前在《PIMPL-隐藏类的私有成员》中介绍了一种隐藏类的私有成员的方法,或者说隐藏接口实现细节的方法-PIMPL。假设提供的接口的入参比较复杂,可能有人会考虑使用结构体作为入参。当你考虑这么做的时候,灾难也将会随之而来……示例://来源:公众号【编程珠玑】//作者:守望先生//api.h#include<iostream>structParam{in...

2020-11-26 21:41:23 16

原创 后台程序实现不当导致磁盘满的问题

之前在《如何让程序真正地后台运行》一文中提到了程序后台运行的写法,但是里面的示例程序在某些场景下是会有问题的,这里先不说什么问题,我们先看看这个磁盘满的问题是怎么产生的,通过这篇文章你将会学习到大量linux命令的实操使用。找到导致磁盘满的程序当发现磁盘占用比较多的时候,可以通过下面的命令,查看各个挂载路径的占用情况:$df-hudev3.9G03.9G0%/devtmpfs784M2.0M782M...

2020-10-11 15:24:27 23

原创 PIMPL:隐藏接口的实现细节

前言有时候我们需要提供对外的API,通常会以头文件的形式提供。举个简单的例子:提供一个从某个指定数开始打印的接口,头文件内容如下://来源:公众号编程珠玑//作者:守望先生#ifndef_TEST_API_H#define_TEST_API_H//test_api.hclassTestApi{public:TestApi(ints):start(s){}voidTestPrint(intnum);private:in...

2020-10-11 15:18:31 28 1

原创 这才是现代C++单例模式简单又安全的写法

前言说到单例模式,很多人可能都已经很熟悉了,这也是面试常问的一个问题。对于单线程而言,单例的实现非常简单,而要写出一个线程安全的单例模式,曾经有很多种写法。有兴趣的可以参考这篇文章《单例模式很简单?你真的能写对吗》简单实现该文章中也提到,由于C++11及以后的版本中,默认静态变量初始化是线程安全的。The initialization of such a variable is defined to occur the first time control passes through its d

2020-09-06 21:53:15 75

原创 C语言数组还能这么用?学到了!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码,对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢?//来源:公众号【编程珠玑】//作者:守望先生#include<stdio.h>structTest0{inta;intb;char*c;};structTest1{inta;...

2020-08-29 20:28:29 51

原创 32位程序和64位程序这些区别你知道吗?

我们在编写C/C++程序时,32位程序和64位程序的代码有何区别?如何编写既可以编译成32位程序又可以编译成64位程序的代码?代码上的区别实际上,对于32位程序和64位程序来说,代码上的区别不大,严格来说,甚至是一样的,它的主要区别在于一些基本数据类型占用的字节长度不一样(注:这里仅针对类Unix平台)类型 32位占用字节 64位占用字节 long 4 8 unsigned long 4 8 指针 4 8 当然这里的long包括一些

2020-06-26 09:14:00 247

原创 神奇,C代码竟然能当成shell脚本一样“直接”执行!

前言我们都知道,写完了的C代码是需要编译链接之后才能运行的(也许你不需要手动点击编译,但是IDE可能帮你做了这件事),那么能不能让C代码像执行shell脚本或者Python脚本一样,直接可运行呢?类似于:$./main.c就可以直接运行了。看起来虽然没啥用,但是感觉有点小刺激。​小试牛刀对于文本内容,系统首先会尝试当成shell进行解释执行,这一点还不明白的朋友,建议先阅读《为什么执行命令开头需要./》。不过话又说回来,.c最终要编译成可执行文件,如果想要它直接...

2020-05-24 17:49:54 161

原创 C语言数组下标-1你见过吗?

不知道你有没有见过-1作为数组下标的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。​下标-1的代码这里redis源码中的一部分:sdssdsMakeRoomFor(sdss,size_taddlen){void*sh,*newsh;size_tavail=sdsavail(s);size_tlen,newlen;chartype,oldtype=s[-1]&SDS_TYPE_MASK;...

2020-05-16 18:21:40 862

原创 C语言为什么只需要包含stdio.h就能使用里面声明的函数?

​有人问:C语言为什么只需要include<stdio.h>就能使用里面声明的函数?这是一个看起来非常简单的问题,但是很多初学者,甚至学了很久的人都可能没有搞明白。为什么包含即可用?要明白包含即可用的原因,就必须讲到C语言代码是如何变成可执行文件的了,这里可以参考《hello程序是如何变成可执行文件的》。这里使用#include指令,在预编译之后,相当于把文件里面的内容都放到.c中了。//hello.c#include<stdio.h>intmai...

2020-05-10 21:23:46 834

原创 如何在Linux下显示当前git分支

之前有读者在《Linux下如何优雅地修正命令?》中问到,如何在终端显示当前的git分支,实际上这就是自定义终端显示配置了。不过在直接介绍如何显示当前分支之前,来看看到底怎么回事。bashrc配置每次我们登录一个shell终端的时候,前面都有一些固定的显示信息:root@ubuntu:#这些显示信息其实可以配置的。我们打开用户家目录下的.bashrc文件,找到类似下面的关于...

2020-04-18 20:24:35 393

原创 教你写出健壮可靠的shell脚本!
原力计划

如果秉承着能跑就行的态度写shell脚本,是很自在的,但是如果你想要写出健壮,可靠的shell脚本,可没那么容易。那么有什么可操作的经验或者方法吗?语法检查第一个最简单的方法就是利用工具对脚本进行检查,这一部分已经在《有了这个神器,再也不怕shell写不对了》中介绍过了,它能最大程度地发现shell脚本中存在的语法错误,如果你还不知道,建议你绝对不要错过。而为了保证脚本健壮可靠,那么就...

2020-04-18 16:38:05 1520 2

原创 一行注释也能影响代码运行?别不信!

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng没想到吧,一行注释也能影响运行结果也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。见证“奇迹” 1//来源:公众号【编程珠玑】 2//作者:守望先生 3#include<stdio.h> 4#include<math....

2020-04-12 08:37:49 4686 17

原创 有了这个神器,再也不怕shell写得不对了
原力计划

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng​写过shell脚本的人都知道,即便出现一些简单的语法错误,运行的时候也可能没有办法发现。有些看似运行正确的脚本,实际上可能在某些分支,某些场景下仍然出现错误,而有的写法可能运行正常,但是却不符合POSIX标准,不具备可移植性。诚然,shell脚本是解释运行,没有办法向C/C++那样严格检查,但是我们...

2020-04-11 21:04:47 1092 1

原创 如何快速修正你的Linux命令?

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng如何快速纠正你的linux命令?我们在输入命令的时候,难免会出现输入命令错误,或者输入过多,过少的情况,那么除了各种按方向键退回之外,还有什么快速纠正命令的方法?本文用|表示光标位置。移动到命令开头举个例子,你准备执行一个命令:./test-axxx-bbbb|但是你输入...

2020-03-21 11:11:18 228

原创 除了语言本身,程序员还应掌握哪些技能

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言作为C/C++开发,其语言的掌握自然是非常重要的,当然了,与此相关的算法,计算机基础,网络等知识也都是需要学习了解的,那么除此之外,还有哪些是建议掌握的呢?Linux这个我在《学Linux到底学什么》中已经说到过了,作为C/C++开发, 很大程度都是需要和Linux打交道的,既然如此,...

2020-03-21 11:03:29 235

原创 高频面试题-如何交换两个变量值?办法没你想得那么多!

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxianshengC语言交换两个整型变量,你有哪些方法?那么多方法,又有哪几个可行?不可行的方法初学者最容易理解错的方法://来源:公众号【编程珠玑】//https://www.yanbinghu.com#include<stdio.h>voidswap(inta,intb){...

2020-01-11 20:32:58 2664 2

原创 解引用NULL会导致挂死?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng解引用NULL指针为什么会出错,导致程序挂死?或者说访问内存地址为0的位置为什么会视为非法?先了解NULL​参考《NULL,0,'\0'有何区别?》。解引用NULL解释问题之前,先描述问题。请看下面的代码://来源:公众号【编程珠玑】//https://www.yanbinghu...

2020-01-10 08:09:18 483

原创 几个简单但你可能忽略的C知识点

C语言main函数的写法标准中,只有下面两种写法:intmain(void){/**body**/}以及intmain(intargc,char*argv[]){/**body**/}而C++的第二种与C类似,第一种是这样的:intmain(){/**body**/}参考《C语言的main函数到底该怎么写》​...

2020-01-04 08:53:00 658

原创 换个角度说makefile

作为Linux下的C/C++开发者,没接触过makefile一定说不过去,通常构建大型的C/C++项目都离不开makefile,也许你使用的是cmake或者其他类似的工具,但它们的本质都是类似的。作为一个轻度使用者,应读者要求,斗胆介绍一下makefile,不过与普通的makfile教程不同的是,本文准备从另外一个角度来介绍。如有不妥之处,欢迎指出。makefie到底是什么在...

2020-01-04 08:46:57 429

原创 多线程就一定快吗?天真!

​在《多线程排序》中介绍了多线程排序,似乎看起来多线程快了很多,然而多线程就一定更快吗?为什么多线程就不一定快?还是拿《多线程排序-真香!》中的程序举例,下面是各个线程数量的排序结果:线程数 时间/s 1 2.393644 2 1.367392 3 ...

2019-12-31 09:18:14 972

原创 生成随机数的方式你选对了吗?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng生成随机数的N种方式首先需要说明的是,计算机中生成的随机数严格来说都是伪随机,即非真正的随机数,真正随机数的随机样本不可重现。那么我们来看看代码中有哪些方式可以生成随机数。randrand函数声明如下:#include<stdlib.h>intrand(void);...

2019-12-25 21:06:39 3216

原创 多线程排序-真香

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在《系统编程-多线程》中已经了解了多线程的一些特点,其中包括快!那么今天就来看看如何利用多线程来排序。思路我们的思路是这样的: 假设有N个线程,则将数组数M据分为N组 每个线程对其中的一组数据使用库函数提供的快速排序算法 所有线程排序完成后,将每组排序好的数组合并 ...

2019-12-25 21:00:17 1583 1

原创 void*该如何理解?

原文地址:https://www.yanbinghu.com/2019/12/15/19682.html说到C就不得不提指针,而一提到指针,有一个是比较特殊的,那就是void*。void*到底是怎样的存在?​指针类型的含义在说明void*之前,先了解一下普通指针类型的含义。//来源:公众号【编程珠玑】//main.c#include<stdio.h...

2019-12-18 19:10:34 698 1

原创 系统编程-文件I/O

​来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng我们都听过Linux下一切皆文件,实际上无论是普通的文件读写,还是网络IO读写,它们都有着类似的操作过程。本文通过基本文件IO操作,来了解Linux“一切文件”的读写。当然过程中穿插着很多其他内容。文件I/O过程在介绍具体的函数使用之前,我必须说明一下文件I/O的基本过程。它们类似过程如下:...

2019-12-14 10:51:16 250

原创 善用shared_ptr,远离内存泄露(文末福利)

​来源:公众号【编程珠玑】作者:守望先生《为何优先选用unique_ptr而不是裸指针?》中说到,如果有可能就使用unique_ptr,然后很多时候对象是需要共享的,因此shared_ptr也就会用得很多。shared_ptr允许多个指向同一个对象,当指向对象的最后一个shared_ptr销毁时,该对象也就会自动销毁。因此,善用shared_ptr,能够远离内存泄漏。...

2019-12-12 21:26:53 265

原创 不可不知的三种缓冲类型

​来源:公众号【编程珠玑】作者:守望先生原文地址:https://www.yanbinghu.com/2019/12/01/27836.html为什么有时候写入文件的内容却没有?没什么printf打印在终端的内容看不到?这一切背后有着怎样早为人知的秘密?今天来说说缓冲的事。也许你已经听说过三种缓冲模式,但是今天要讲的不止这些。缓冲为了减少使用read和write调用的次...

2019-12-07 21:13:52 316

原创 如何让你的程序同时只能运行一个?

有些程序我们希望在一台机器上只有一个实例在运行,我在windows下也遇到过很多类似这样的程序,如QQ,它只允许同时运行一个。那么我们在Linux该如何实现这样的单例运行的程序呢?思路实现这样的程序方法很多,但是总体思路都是类似的: 1.启动程序,检测标志,判断是否有同样的程序运行,是则2,否则3 2.程序退出 3.程序启动,并设置标志,以便下次启动时检...

2019-12-02 21:32:08 410

原创 聊点基础的--sizeof,strlen,数组,字符串在一起能整哪些坑?

对于初学者来说,sizeof,strlen,数组,字符串整在一起是痛苦的,它总能在某些莫名其妙的时候整一个措手不及。本文看看它们在一起能挖什么坑。例子在说明这些问题之前,先看一段代码,看看你是否都理解了。(注:以下代码结果为编译为64位程序后运行结果)//来源:公众号【编程珠玑】#include<stdio.h>#include<string.h>v...

2019-11-22 12:47:14 807 2

原创 这个编程技巧别说我没告诉你

​前言有读者在后台留言说用c写一篇有限状态机的推文,正好之前也用过,就分享一下吧。背景先举一个简单的例子,假设是这样的,一个小孩有两种状态,睡眠,清醒。睡的时候可能会撒尿,微笑,撒尿之后会转为清醒状态,而清醒的时候可能会笑,会吃,吃完之后会转会睡眠状态用C语言实现,一般写法可能是这样的://来源:公众号【编程珠玑】#include<stdio.h>enum...

2019-11-16 09:00:35 563 1

原创 工作中几乎用不到算法,为何要学算法?

前言不知道你有没有发现,非算法类的岗位,工作之后几乎没有用到什么算法,为什么还要学算法?本文谈谈自己的看法,不供参考。从用人者角度毋庸置疑,面试是用来筛选候选人的,在这个僧多粥少的时候,就需要提高筛选条件,例如最常见的学历,不是说学历一般的人不好,而是总体来说,学历好的人里面挑选到合适的概率比较大而已,这就是现实。而面试题中,算法相比于其他记忆型的题目,就能很好的体现一个人的逻辑...

2019-11-14 14:02:24 903

原创 为何优先选用unique_ptr而不是裸指针?

前言​在《拥抱智能指针,告别内存泄露》中说到了内存泄漏问题,也提到了C++中的智能指针基本原理,今天就来说说类模板unique_ptr。在此之前,先回答读者的一个提问:C语言中该怎么办?有几点建议: 编写时尽量遵循函数内申请,函数内释放的原则 注意成对编写malloc和free 使用静态扫描工具,如《pclint检查》 使用内存检测工具,如valgr...

2019-11-11 21:16:45 607

原创 Linux安装C++手册,就是这么简单

前言在Linux编写或者编译C代码的时候,直接使用man命令就可以查看该函数的使用手册,非常方便,如:man3sleep但是一般却没有C++的函数手册,怎么把C++的帮助手册也装在机器上呢?本文借助C++手册的安装,说明如何自助安装man手册。man原理如果你还不习惯使用man命令或者不清楚man命令的作用,那么建议你先看看这篇《linux必学命令-ma...

2019-11-08 09:26:55 381

原创 超棒离线手册-每个开发者的福音

前言昨天在分享如何安装man手册时候,有读者留言提到了zeal,特意去体验了一下,感觉还不错,也分享给大家。在这里再次感谢读者【0x27】。zeal不知道你是否曾经想过,如果有一个工具,类似于软件管理工具,我要什么文档下载什么文档,然后就可以使用了,那该多好,就不用到处找文档了。zeal是一款属于开发者的离线文档工具,解决了你多个文档来回下载,翻看的烦恼。我找到了它的官网:...

2019-11-08 09:25:03 399

原创 拥抱智能指针,告别内存泄露

前言我们都知道,当申请的内存在不用时忘记释放,导致内存泄漏。长期来看,内存泄漏的危害是巨大的,它导致可用内存越来越少,甚至拖慢系统,最终进程可能被OOM(out of memory)机制杀死。C与C++中的内存泄漏在C语言中,我们用malloc申请内存,free释放内存;在C++中,也可以使用它们,不过对于自定义类型,常常会使用new申请,delete来释放。它们都有同样的问题,...

2019-11-07 21:39:02 2512 2

原创 linux自助安装man手册,就是这么简单!

前言​在Linux编写或者编译C代码的时候,直接使用man命令就可以查看该函数的使用手册,非常方便,如:man3sleep但是一般却没有C++的函数手册,怎么把C++的帮助手册也装在机器上呢?本文借助C++手册的安装,说明如何自助安装man手册。man原理如果你还不习惯使用man命令或者不清楚man命令的作用,那么建议你先看看这篇《linux必学命令-m...

2019-11-05 22:16:30 811

原创 C++和C中的const关键字有何区别?

前言在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。修饰普通变量--只读在C语言,虽然表面是不允许被修改,但是看下面的代码:#include<stdio.h>intmain(void){constinta=10...

2019-11-02 08:53:32 303

原创 有了它,再也不怕C中的复杂声明了

前言随着学习的深入,你可能慢慢地接触到越来越多的复杂声明,而这里有一个网站,帮你识别复杂的声明。试一试你知道下面的声明是什么意思吗?void(*signal(int,void(*)(int)))(int);没关系,访问https://cdecl.org/输入上面的内容就可以知道了:我们就得到了这个声明的含义:declare signal as fu...

2019-11-01 12:33:40 246

原创 几道C/C++小题,看看你会不会?

构造函数下面使用无参构造函数声明变量的方式对吗?为什么?应该如何修改?Testtest();答案参考《认真理一理C++的构造函数》。数组和指针下面代码的输出结果是什么?//实际中千万不要这么写#include<stdio.h>intmain(void){inta[5]={1,2,3,4,5};int...

2019-11-01 12:32:13 311

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除