编程珠玑

其他

性能优化-放开那片内存,让我来!

转载请注明以下内容:来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng性能优化是一个常有的事情,通常来说不要过早优化-当你没有性能问题时,不需要过早考虑优化,当然对于一些代价很小,收益却很大的手段可以考虑做进来,例如最常见的就是根据业务需求选择合适的数据结构。不要过度优化。优化都是有目标的,比如你需要达到多少TPS,那么你按照这个目标去优化即可,有些优化虽然能否提升性能,但可能对代码的可维护性造成破坏。本人对此没有过多涉猎,仅分享工作中接触到的一些内存。内存性能问题有很多方面会造成性能问题,例如:业务流程设计不合理,导致很多没有必要的计算数据结构选择不合适缓存使用不当示例假设你已经通过《perf:一个命令发现性能问题》中的方法或者使用profiler分析,已经发现内存分配是性能瓶颈://
2020年12月21日
其他

性能优化-一个命令发现性能问题

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng为了取得程序的一丁点性能提升而大幅度增加技术的复杂性和晦涩性能,这个买卖做不得,这不仅仅是因为复杂的代码容器滋生bug,也因为他会使日后的阅读和维护工作要更加艰难。《Unix编程艺术》为什么要性能优化也许是想要支持更高的吞吐量,想要更小的延迟,或者提高资源的利用率等,这些都是性能优化的目标之一。不过需要提醒的是,不要过早的进行性能优化。如果当前并没有任何性能问题,又何必耗费这个精力呢?当前一些有助于提高性能的编码习惯还是可以时刻保持的。目标全面的性能优化不是一件简单的事情。本系列文章不在于介绍性能优化原理或者特定的算法优化。旨在分享一些实践中常用到的技巧,同时也主要关注CPU方面。如何发现性能瓶颈解决性能问题的第一步是发现性能问题。如何快速发现性能问题呢?对于本文来说,如何发现那些使CPU不停地瞎忙的代码呢?为什么这里是说让CPU瞎忙的代码?举个例子,完成某个事情,你可能只需要一个CPU时间片,但是由于代码不够好,使得仍然需要多个CPU时间片。导致CPU非常忙碌,而无法继续提高它的效率。top这个命令相信大家都用过,可以实时看到进程的一些状态。它的使用方法有很多文章不厌其烦地对其进行了介绍,本文不打算进行介绍。我们可以通过top命令看到某个进程占用的CPU,但是CPU占用高并不代表它有性能问题,也有可能是CPU正在有效地高速运转,并没有占着茅坑不拉屎。快速发现想必我们都听过八二法则,同样的,80%的性能问题集中于20%的代码。因此我们只要找到这20%的部分代码,就可以有效地解决一些性能问题。本文使用perf命令,它很强大,支持的参数也非常多,不过没关系,本文也没打算全部介绍。系统中可能没有perf命令,ubuntu可以使用如下方法安装:sudo
2020年8月24日
其他

哦!数组还能这么用,学到了!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码,对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢?//来源:公众号【编程珠玑】//作者:守望先生#includestruct
2020年7月21日
其他

C++中是如何调用C接口的?

来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com一篇旧文,表示公众号还在更,就是慢了点。前言如何在C++代码中调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。C++如何调用C接口为什么会有这样的情况呢?想象一下,有些接口是用C实现的,并提供了库,那么C++中该如何使用呢?我们先不做任何区别对待,看看普通情况下会发生什么意想不到的事情。首先提供一个C接口://来源:公众号【编程珠玑】//
2020年7月11日
其他

万万没想到,一个可执行文件原来包含了这么多信息!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng拿到一个编译好的可执行文件,你能获取到哪些信息?文件大小,修改时间?文件类型?除此之外呢?实际上它包含了很多信息,这些你都知道吗?示例程序//main.c#includevoid
2020年6月8日
其他

redis为什么不直接使用C字符串,而要自定义简单动态字符串?

的默认字符串。那么,为什么要用这种数据结构替代传统的字符串呢?我们先回顾一下C字符串。C语言传统字符串C语言传统字符串是以空字符结尾的字符数组。例如:char
2020年5月13日
其他

数组下标-1你见过吗?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng不知道你有没有见过-1作为数组下标的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。下标-1的代码这里redis源码中的一部分:sds
2020年5月11日
其他

C语言为什么只需要include<stdio.h>就能使用里面声明的函数?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng有人问:C语言为什么只需要include就能使用里面声明的函数?这是一个看起来非常简单的问题,但是很多初学者,甚至学了很久的人都可能没有搞明白。为什么包含即可用?要明白包含即可用的原因,就必须讲到C语言代码是如何变成可执行文件的了,这里可以参考《hello程序是如何变成可执行文件的》。这里使用#include指令,在预编译之后,相当于把文件里面的内容都放到.c中了。//hello.c#includeint
2020年5月6日
其他

性能优化小技巧-消除低效循环,让你的程序快到飞起

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在分享这些性能优化技巧之前,需要说明以下几点不要过早优化性能现代编译器的优化能力很强大80%的性能问题集中于20%的代码中但是由于编译器的优化非常小心,它必须确保优化前后执行的效果是保持一致的,因此有些时候它会变得保守,并不能帮你优化太多。本文所需要的是在平常不需要花费太多力气,养成习惯,并且对程序性能有好处的小技巧。示例程序为了说明本文所提到的技巧效果,先看一个示例程序,程序的目的非常简单,就是将字符串中的小写字母转换为大写),以下是完整可编译运行代码://来源:公众号【编程珠玑】//作者:守望先生//loop.c#include#include#include#include#include#include#define
2020年4月20日
其他

讨论:科班和非科班出身的程序员有何差别?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng之前在《公众号文章主题征集:你问我写》中,有读者留言说现在有很多非计算机专业的转行程序员,普通工科出身程序员与计算机专业出身程序员之间有什么差距?以下仅一家之言,不供参考,欢迎补充。有一说一说实话我也不知道。我本身是学通信工程的,所以严格说也不算科班出身。不过我问了一下计算机专业出身的同学,他的大意是:由于有完善的课程体系:基础编程语言,数据结构,算法,操作系统,计算机网络,软件工程等,计算机专业的毕业生可能对相关的只是有更广的认识,虽然上课时不一定认真听,也许在深度上并没有什么优势,但是对于一些基础的内容都有认知,对以后想往某个方面作深入的了解都有帮助。也就是说,起码别人是知道自己不知道什么,而非科班的通常是不知道自己不知道什么,可能一些基本的概念完全没有听过。同时,计算机专业的通常对整个计算机体系有一个整体的认识,不至于有较大程度的断层。这里推荐《深入理解计算机系统》。不同人眼中的程序员有的人觉得想要成为程序员,就是学习:C语言C++JavaJavaScriptPythonPHPGo……以及其相关的各种框架或工具的使用。而计算机专业的人觉得,想要成为程序员,要学习:数字逻辑电路线性代数概率论离散数学计算机导论计算机体系结构面向对象程序设计C语言编程语言数据结构与算法汇编编译原理计算机组成原理计算机网络操作系统数据库系统软件工程设计模式颈椎病防治综合指南……当然他们知道要学,至于学不学那就是人各有志了。看起来好像差别不小?语言不重要吗当然重要,但不是最重要,毕竟企业雇你大多数时候就是需要你使用某种语言完成某种功能开发,这是基本。不过仔细看一些公司的招聘会发现,语言这里通常会说:熟练掌握xx/xxx/xx语言中的任一一种而关于语言方面的要求从来不会少,但是基本只有一条!也就是说,其他的要求通常和具体某种语言无关,但是通常是可以由语言扩展出来的。就拿很多大厂来说,他们通常更多地考察一些操作系统,数据结构与算法,计算机网络等相关内容,而有了这些内容作为基础,学习新的东西,如一门新的语言,也是比较快的。如何弥补?1.知道自己不知道什么2.让自己知道这些不知道的3…….知道自己不知道什么善用搜索引擎留意别人踩的坑关注前人总结的经验参考别人给的建议不必一定认同,但是都可以看看。比如公众号【编程珠玑】以及本文的内容,比如本文留言区。实际上,你在工作中就会遇到很多的问题,比如为什么这个程序运行内存占用这么大?为什么处理这么慢?为什么网络这么卡?为什么挂死了?为什么这样就可以了?为什么又不可以了?仔细回想一下,就会发现,原先自己不知道的还有很多。你可能某一次搜索完,诶不知道怎么的就解决了,然后就say
2020年4月17日
其他

教你写出健壮可靠的shell脚本!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng如果秉承着能跑就行的态度写shell脚本,是很自在的,但是如果你想要写出健壮,可靠的shell脚本,可没那么容易。那么有什么可操作的经验或者方法吗?语法检查第一个最简单的方法就是利用工具对脚本进行检查,这一部分已经在《有了这个神器,再也不怕shell写不对了》中介绍过了,它能最大程度地发现shell脚本中存在的语法错误,如果你还不知道,建议你绝对不要错过。而为了保证脚本健壮可靠,那么就需要保证脚本在一些特殊的情况及早出现,避免漏网之鱼。来看看有哪些可行的技巧。脚本失败时即退出可以在脚本的开头设置如下:set
2020年4月13日
其他

有了这个神器,再也不怕shell写得不对了

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng写过shell脚本的人都知道,即便出现一些简单的语法错误,运行的时候也可能没有办法发现。有些看似运行正确的脚本,实际上可能在某些分支,某些场景下仍然出现错误,而有的写法可能运行正常,但是却不符合POSIX标准,不具备可移植性。诚然,shell脚本是解释运行,没有办法向C/C++那样严格检查,但是我们仍然可以借助一些工具帮助我们提前发现一些错误。shellcheckshellcheck就是这样的一个工具。它可以在多种场景下使用,包括在线,命令行检查,编辑器配置,下面逐一介绍。在线使用顾名思义,它提供了一个在线的检查地址,https://www.shellcheck.net/,进入网址即可使用。例如,你输入你的脚本内容:#!/bin/shfor
2020年4月9日
其他

一行注释也能影响运行结果?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng没想到吧,一行注释也能影响运行结果也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。见证“奇迹”
2020年4月1日
自由知乎 自由微博
其他

公众号文章主题征集:你问我写

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng从开始到现在,也写了差不多近两百篇原创了,内容涉及Linux,算法,C/C++
2020年3月29日
其他

如何调教你的终端提示符?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng之前有读者在《Linux下如何优雅地修正命令?》中问到,如何在终端显示当前的git分支,实际上这就是自定义终端显示配置了。不过在直接介绍如何显示当前分支之前,来看看到底怎么回事。bashrc配置每次我们登录一个shell终端的时候,前面都有一些固定的显示信息:root@ubuntu:#这些显示信息其实可以配置的。我们打开用户家目录下的.bashrc文件,找到类似下面的关于PS1的内容:if
2020年3月25日
其他

字节对齐,看这篇就懂了

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng有读者对字节对齐还有些疑问,这里分享一篇旧文。字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?本文将简单理一理字节对齐的那些事。什么是字节对齐计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的
2020年3月24日
其他

两步将Linux终端骚操作做成动图!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在《如何快速执行历史命令》中有读者留言问,文章中的动图是如何制作的?今天就开一篇简单分享一下,也欢迎留言分享你的方法。以下方法在macos中也适用,欢迎尝试。软件准备制作动图需要两个命令行软件:ttyrec
2020年3月23日
其他

Linux下如何快速执行历史命令

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxianshengLinux下执行了一些命令之后,可能还想再次执行,有没有什么方法快速执行呢?找出历史命令并执行第一种方法比较传统,使用history命令或者fc
2020年3月20日
其他

Linux下如何优雅地修正命令?

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

除了语言本身,还有哪些技能或知识是必备的?

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

程序员的口头禅是什么?

作者:帆软链接:http://dwz.date/sWH编辑:公众号【编程珠玑】本文已授权。生活还得继续。0.又不是不能用1.卧槽这个好NB,我研究一下2.在我电脑上是正常的啊3.这个技术上实现不了4.你忘记清缓存了兄弟5.这不是BUG!是配置问题,要不就是网络问题6.只是改一行代码,不会对程序产生影响的,放心7.程序没问题,你是怎么操作的8.卧槽,还有这种操作?!9.这个代码TM谁写的啊?10.不用担心,这次肯定没问题了11.这个功能下个版本再做吧12.你刷新一下试试13.文档写的很清楚了啊14.一定有人改了我的代码15.我没有把它改好么?16.我不能把所有的程序都测试了!17.那只是一个偶然事件18.程序很快就好19.卧槽!为啥这个程序跑起来了?20.卧槽!为啥这个程序跑不起来?21.重启试试关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源
2020年3月6日
其他

一个有趣却容易忽略的编译链接问题

来源:公众号【编程珠玑】作者:守望先生转载请保留来源!在《一个奇怪的链接问题》一文中,有一个读者提到了一个有趣的问题:为什么在C++中使用了pow函数不需要链接libm库?什么情况需要指定链接库在解释之前,先回顾一下。//来源:公众号【编程珠玑】//https://www.yanbinghu.com#include#includeint
2020年1月15日
其他

结构体成员赋值到底是深拷贝还是浅拷贝?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在《C语言容易忽略的知识点》一文中,有读者说这种结构体复杂成员赋值的的拷贝是浅拷贝(感谢读者提出),那么到底什么是深拷贝,什么是浅拷贝?浅拷贝浅拷贝指的是仅拷贝对象的所有成员,而不包括其引用对象(例如指针指向的其他内容)。我们来看C和C++的例子。C++的例子如下://来源:公众号【编程珠玑】//https://www.yanbinghu.com#include
2020年1月6日
其他

几个无聊但你可能忽略的C知识点

^注意,使用函数前一定要声明,对于没有声明,而试图使用,可能会错将int用成其他类型,导致灾难。参考《记64位地址截断引发的挂死问题》如果main函数没有return#includeint
2020年1月2日
其他

换个角度说Makefile

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng作为Linux下的C/C++开发者,没接触过makefile一定说不过去,通常构建大型的C/C++项目都离不开makefile,也许你使用的是cmake或者其他类似的工具,但它们的本质都是类似的。作为一个轻度使用者,应读者要求,斗胆介绍一下makefile,不过与普通的makfile教程不同的是,本文准备从另外一个角度来介绍。如有不妥之处,欢迎指出。makefie到底是什么在Linux下,对于下面这个简单的程序//来源:公众号【编程珠玑】//main.c#include
2019年12月31日
其他

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

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

系统编程-文件读写这件小事

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在《系统编程-文件IO》中简单介绍了文件I/O的基本流程,无论选项或者参数多么变化多端,其流程大抵相同,不过是获取文件描述符,用描述符进行操作,关闭描述符,三步而已。那么文件读写又是怎样的流程?需要注意什么?write/read在说明这些常见出错之前,就必须先了解其基本用法了。需要注意的是,write/read是不带缓冲的,调用一次,写一次。与fwrite/fread有区别,另外write/read为系统调用,频繁地系统调用将会增加开销,可参考《库函数和系统调用的区别》。#include
2019年12月20日
其他

我有一个问题,用了多线程后,两个问题有了现在

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng多线程,作为一个开发者,这个名词应该不陌生。我在《对进程和线程的一些总结》中也有介绍,这里就不详述。为什么要用多线程很显然,多线程能够同时执行多个任务。举个例子,你打开某视频播放器,点击下载某个视频,然后你发现这个时候一直在下载,其他啥都干不了,那你肯定骂*。所以在这种情况下,可以使用多线程,让下载任务继续,同时也能继续其他操作。作为一个包工头,一堆砖要搬,但是就一个人,可是你只能搬这么多,怎么办?多找几个人一起搬呗,但是其他人就也需要付工钱,没关系,能早点干完也就行了,反正总体工钱差不多。同样的,如果有一个任务特别耗时,而这个任务可以拆分为多个任务,那么就可以让每个线程去执行一个任务,这样任务就可以更快地完成了。代价听起来都很好,但是多线程是有代价的。由于它们“同时”进行任务,那么它们任务的有序性就很难保障,而且一旦任务相关,它们之间可能还会竞争某些公共资源,造成死锁等问题。绑核通过下面的命令可将进程proName程序绑在1核运行:taskset
2019年12月18日
其他

void*到底是怎样的存在?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng说到C就不得不提指针,而一提到指针,有一个是比较特殊的,那就是void*。void*到底是怎样的存在?指针类型的含义在说明void*之前,先了解一下普通指针类型的含义。//来源:公众号【编程珠玑】//main.c#include
2019年12月16日
其他

系统编程-简洁而不简单的文件操作

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng我们都听过Linux下一切皆文件,实际上无论是普通的文件读写,还是网络IO读写,它们都有着类似的操作过程。本文通过基本文件IO操作,来了解Linux“一切文件”的读写。当然过程中穿插着很多其他内容。文件I/O过程在介绍具体的函数使用之前,我必须说明一下文件I/O的基本过程。它们类似过程如下:以某种模式打开文件,获取一个文件描述符对文件进行读写不需要时,关闭文件描述符文件描述符是什么?你可以认为是一个对文件进行操作的凭据,你只有通过它才能对文件进行读写。它是一个非负整数。通常0是标准输入,1是标准输出,2是标准错误(参考《如何理解Linux
2019年12月13日
其他

再说数组

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng之前在每周小题中留下了这样一个问题://代码输出结果什么//公众号【编程珠玑】#includeint
2019年12月10日
其他

如何让程序真正地在后台运行?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng如何实现一个守护进程?如何让程序在后台运行?这是后台开发面试常问的一道题,那么守护进程到底是什么?又该如何实现?守护进程守护进程通常生存期长,很多是在系统启动时启动,系统退出时才关闭。它们的特点通常没有控制终端,后台运行。有人可能会会心一笑,后台运行程序,我知道呀。还有两种方式呢$
2019年12月6日
其他

那些奇奇怪怪的缓冲问题

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在上一篇《不可不知的缓冲类型》中说到了三种缓冲类型,看起来很简单对不对?今天我们看看如何修改这些默认的缓冲类型,以及在实际中可能遇到哪些问题。更改缓冲类型在上一篇中说到了一些默认的缓冲类型,例如:指向终端设备的流是行缓冲的标准错误是不带缓冲的指向文件的流是全缓冲的……那么这些默认的缓冲类型如何修改?有几个函数可以用来更改缓冲类型:#includevoid
2019年12月4日
其他

不可不知的三种缓冲类型

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng为什么有时候写入文件的内容却没有?没什么printf打印在终端的内容看不到?这一切背后有着怎样早为人知的秘密?今天来说说缓冲的事。也许你已经听说过三种缓冲模式,但是今天要讲的不止这些。缓冲为了减少使用read和write调用的次数,标准IO库提供了缓冲,有人可能会问,为什么要减少它们的调用次数?很明显read和write是系统调用,它们花费的时间将会更多,本文不展开描述,可以参考《库函数和系统调用》。那么有哪三种缓冲类型呢?全缓冲在全缓冲的情况下,在填满标准I/O缓冲区后,才进行实际的I/O操作。写磁盘文件通常就是全缓冲的。举个例子:/*来源:公众号【编程珠玑】博客:https://www.yanbinghu.combuff.c*/#include#includeint
2019年12月2日
其他

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

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng有些程序我们希望在一台机器上只有一个实例在运行,我在windows下也遇到过很多类似这样的程序,如QQ,它只允许同时运行一个。那么我们在Linux该如何实现这样的单例运行的程序呢?思路实现这样的程序方法很多,但是总体思路都是类似的:1.启动程序,检测标志,判断是否有同样的程序运行,是则2,否则32.程序退出3.程序启动,并设置标志,以便下次启动时检测实现方法按照这种思路,实现的方法有很多种,例如使用ps等命令获取该进程的进程数,大于0
2019年11月29日
其他

文件读写测试,磁盘读写测试全靠它

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng有时候需要测试磁盘读写速度,或者临时读写文件,不想临时写代码?有没有测试使用的命令?当然有!dd命令dd命令可以用于文件的拷贝或者内容转换。常见操作选项如下:bs=BYTES
2019年11月27日
其他

如何优雅地将printf的打印保存在文件中?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng我们都知道,一般使用printf的打印都会直接打印在终端,如果想要保存在文件里呢?我想你可能想到的是重定向。例如:$
2019年11月22日
其他

Linux下你还知道这些特殊文件?

e1f9/dev/pts/dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。有什么用呢?举个例子,你打开一个终端,获取到当前的pts:$
2019年11月21日
其他

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

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

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

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

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

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言不知道你有没有发现,非算法类的岗位,工作之后几乎没有用到什么算法,为什么还要学算法?本文谈谈自己的看法,不供参考。从用人者角度毋庸置疑,面试是用来筛选候选人的,在这个僧多粥少的时候,就需要提高筛选条件,例如最常见的学历,不是说学历一般的人不好,而是总体来说,学历好的人里面挑选到合适的概率比较大而已,这就是现实。而面试题中,算法相比于其他记忆型的题目,就能很好的体现一个人的逻辑和思路,因而也是一个很好的筛选条件。当然像操作系统,网络,Linux等都是很多公司喜欢考察的点。所以为了面试还是需要准备学习算法的,只不过面试所要准备的就比较广了。从个人角度进去的第一家公司基本用不上什么算法(血的教训,在学校的时候一定要好好准备),甚至用不上网络编程,基本就是简单纯C开发,因为那些东西早就封装好了(由另外一个组负责开发维护),只需要调用即可。包括后来去面试,主要面试了两类公司,一类是传统通信技术类,一类是互联网公司,前者关注项目本身,以及基本的技术技能更多一些,而后者考察的方面通常比较多,包括操作系统,数据库,算法,网络等知识。那么面完之后是不是真的就完全没用了呢?确实,大多数时候根本用不上。你写的可能多是业务代码,是业务流程的设计,代码实现可能只是很小的一环。而且现有算法实现一搜一大把,基本不太可能要你自己去实现什么快排,跳表,快排,红黑树之类的算法,但是学习算法有好处。例如,你可能要根据你的业务排序需求来选择是用稳定排序还是非稳定排序;你可能会根据插入和删除数据的频率来选择使用array
2019年11月13日
其他

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

Linux,C语言,C++,数据结构与算法,计算机基础,数据库,工具,资源【原创】分享,力求【知其然,更知其所以然】。高质量学习资源免费获取。
2019年11月11日
其他

为什么执行自己的程序要在前面加./

builtin如果是内置命令,则会直接执行,否则继续查找。PATH中查找以ls为例,在shell输入ls时,首先它会从PATH环境变量中查找,PATH内容是什么呢,我们看看:$
2019年11月8日
其他

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

与shared_ptr不同,unique_ptr专属某个对象资源。也就是说,如果某个对象有一个专属管理,它不能被复制,那么当这个专属管理不再使用的时候,就可以自动释放内存了。
2019年11月6日
其他

你见过数组的这种骚操作吗?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng看到朋友圈对一段代码感到很惊奇,这里也分享一下:代码如下:#includeint
2019年11月1日
其他

C++与C中的const关键字有何差别?

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。修饰普通变量--只读在C语言,虽然表面是不允许被修改,但是看下面的代码:#include
2019年11月1日
其他

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

c答案参考《const关键字到底该怎么用》。关注公众号【编程珠玑】,获取更多Linux/C/C++/算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源
2019年10月30日
其他

这样的提问开头建议你别用

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言我们经常会有请教别人问题的时候,而下面这几种是不太建议的提问开头在吗?能问你一个问题吗?有谁知道xxx吗?当然你向我提问的时候,也不用称呼为大佬或者大神之类的,我就是一个普通的开发者。为什么毋庸置疑,你提问的目的自然是想得到解答,而上面三种提问方式都有一个共性,就是在看到上面的问题之后,仍然不知道具体问题是什么,而要简单回复之后才能得到真正问题,显然,这使得真正问题暴露的路径过长。这种问题在当面聊天是没有太大问题,还是可以得到应答的,但是对于在公众号中,交流群中,我个人认为这不是一种很好的方式。举个例子,假如这么问了,而某个人想帮你,然后你说出具体问题,才发现又回答不了,这又尴尬了。所以以上三种方式为什么不好你也应该明白了:在吗?--看到的时候自然在能问你一个问题吗?--绝大多数都是能问,而更多可能无法回答有谁知道xxx吗?--抛出问题,有知道且愿意回答的自然会说建议的开头合理的开头应该包含两部分对解答者的感谢或歉意对问题的清楚描述第一点很容易理解,有可能被提问题者在忙或是帮你解决了难题,表示感谢或者歉意能让被提问题感到被尊重。第二点也非常重要,即将问题描述清楚。以技术类问题为例,你至少应该做以下事情:提问前思考,搜索客观描述问题,贴出关键代码,描述预期结果,实际结果解释自己的思路和想法,做过哪些尝试,疑惑点在哪里这里特别说明问题的描述,描述问题并不是说截图就可以了,而还需要你描述对题目的理解。通常来说,大家都还是比较热心的,但是做好没有人回答你的心理准备。如果可以的话,也可以积极回答他人的问题。总结当然了,以上是一个不断学习的过程,如果你之前用上面的方式提问,可以试着换一换,说不定能提高被回答率。个人看法,不供参考,欢迎交流。关注公众号【编程珠玑】,获取更多Linux/C/C++/算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源
2019年10月29日
其他

作为一个C/C++工程师,聊聊对Python的看法

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言首先说明,这不是软文。仅仅是个人看法,同时也会仍然坚持C/C++,毕竟要吃饭。近年来以及最近想必大家总能看到Python的身影,有的是频繁报道Python制霸编程语言排行榜,有的是总能看到各种Python的培训课程,作为主要使用其他语言的你,恐怕心里很难不会有悸动。那么应该如何看待Python?说说排行榜TIOBE
2019年10月28日
其他

想了想,还是把私藏的精品书单分享给你们!

来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言经常有读者让我推荐书籍,这次我就把我私藏的计算机书单分享给你们!不过由于时间匆忙,不会进行更加详细的介绍。声明由于每个人的情况不一样,推荐的书并不一定适合你,也不一定适合当前阶段的你,有的书籍可能存在内容重复,所以根据自己的阶段情况进行选择即可。虽说如此,以下书单中提单的书均为优质书籍。另外说,本人从事的是Linux/C/C++应用开发相关工作,因此主要书籍与此相关,涉及操作系统,Linux,C/C++,网络,编译链接,算法,数据库等内容,其他方向的会提到,但可能不全,欢迎补充。以下整理均来自公众号【编程珠玑】作者:守望先生C《C程序设计语言》(经典,不适合小白入门)《C语言程序设计:现代方法》《C
2019年10月24日