那些c/c++中实用但经常被重写的函数

c语言学习过程中,老师们总喜欢拿一些标准库已经实现的函数来考察学生,还要求不准直接调用,一定要自己实现,结果天真的大学生们误以为标准库的功能很少,常常上手又自己实现了一遍,其实费功夫还不说,性能甚至还更差。

比如说,在stdlib常用的字符串与数字互转,字符串转数字int atoi(const char*),十进制字符串转整形,其有另外几个版本

atof(const char*)装浮点数,

atol(const char*)转long,

atoll(const char*)转long long等。

名字启发为a(不知道哪个单词)to T(基本数据类型),美中不足的是没有转成无符号整形的。

为了转成无符号整形,可以请出另外一个更强大的函数,int strtoi(const char*,int) ,这个函数允许任意进制的字符串转成基本数据类型,第二参数指明字符串进制,也称为基数。相关版本还有strtol转long,

strtoll转long long,

strtou转无符号整形

strtoul

strtoull

strtod转成double

。。。

string to Type

当然有些小伙伴可能会狡辩说逻辑都一样,大差不差。如果从结果上来说,其实确实差不多,如果你以后要考虑优化性能,其实大可直接用标准库。举一个栗子,在复杂指令集的架构下,有一个十进制调整指令DAA,这个指令可以将二进制数迅速转成bcd码,从bcd码转成十进制需要几个复杂度?DAA指令采用的是逻辑电路实现,不会像求余那样计算,甚至感兴趣的同学可以去了解一下加3移位法,这种级别的实现肯定比高级语言来得快,编译器也会自动优化成与机器相关的高性能汇编代码,所以它肯定比你自己算的来得快,如果你有更快的办法,你可以发论文了。

还有一些有意思的函数,比如div_t div(int ,int)函数,这个函数有意思在如果不知道底层原理,很像脱裤子放屁行为。语言中天然支持/运算符号和%运算符号,一个商,一个求余,div呢又刚好又求除数又求余。有的的小伙伴就得问了,这个div又难记又不简洁,既然标准库已经支持了后两种运算符,这里函数留着不就是多余吗?其实一点也不多余,在汇编级别里,除法指令div可以直接一次运算求出商和余数,所以明明一次除法就可以得出结果,但常常会出现这样的写法:

a=b/c;

d=b%c;

也不是说不对,只是可以替代。这个函数还有替代版本ldiv(long),lldiv(long long),相应的数据结构是ldiv_t和lldiv_t,不过美中不足的是没有无符号版本,差评!当然,如果你开启了编译器优化,或许上述代码也许会自行等价替换,不过离得远就不一定了,具体会不会我还没实验过。

对于c++还有一些有意思的函数,不过他们不写到类里面,这就比较折磨,类代码提示就没用了。比如有一个容器元素翻转函数reverse(it,it),当你在std::string()里面折磨半天发现这个函数居然给提出来了。。。

以上是标准库范畴,还有两个有意思的函数是hton和ntoh,这两个函数是用来做网络字节序转换的,在POSIX类系统中基本都有,名字是host to network和network to host,至于为什么要字节序转换,只因为网络传输规定为大端,而目前市面上的cpu基本是小端。

对于这些实用函数其实用得不多就很难记住,不过好在chatgpt出来了,想到一个东西的时候可以先去查查标准库支不支持等,也就不用费力气撸这种无关紧要的轮子了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值