0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++的hash_map源码

Q4MP_gh_c472c21 来源:程序员鱼皮 作者:鱼皮 2022-09-28 15:25 次阅读

前段时间,无意间在网上看到这么一张图:


0bd188a4-3ef0-11ed-9e49-dac502259ad0.png

刚看到这段代码时,我是比较吃惊的,作者竟然使用了一个英文单词deadbeef来定义宏常量!

我本来以为只是一位幽默的程序员的小玩笑,但后来查阅资料才知道,上图的这段代码竟是 C++ 的 hash_map 源码!而作者使用这个特殊的英文单词也是 “别有用心”。

deadbeef 的英文直译是“死牛肉”,但在编程领域中,它却有着更深层的含义。给这个单词加上0x、再转换为大写,就得到了一个典型的十六进制数字:0xDEADBEEF。

这个数字经常用来标识新分配但是还未初始化的内存;在嵌入式系统中,也常常用它来表示程序崩溃或者出现了死锁,比如运行在 32 位 PowerPC 处理器上的 IBM RS/6000 系统、Mac OS 系统。

那我不禁感到好奇,为什么选择了这样一个单词,而不是 “FishPi” 之类的(开个玩笑,16 进制最多到 F)。

到网上查了一会,得到的结论竟然是:没什么理由,它是一个“魔数”

所谓魔数,就是毫无理由、凭空出现、也不需要去解释其含义的常量。就是这么任性!

除了 deadbeef 外,我还百度到了很多魔数,比如:

0xBAADF00D ("bad food" 烂饭) 被微软的 LocalAlloc(LMEM_FIXED)使用,在使用调试堆时指示未初始化的已分配堆内存;

0xDEADC0DE ("dead code" 死码) 在 OpenWRT 固件中用作标记,在静态固件的末尾表示要创建的 jffs2 文件系统的开始;

0xDEAD10CC ("dead lock" 死锁) 用于表示 iOS 系统的闪退报告。

是不是感觉很神奇?也许这就是程序员的浪漫吧!

看到这里,我忍不住也去写了几个魔数,大家来猜猜看是什么意思:

redisLock.lease(86400);
if(fileSize>1073741824){
...doSomething
}
if(num>2147483647){
printf("youlose");
}

这几个值都是我们写代码时经常用的,84600 = 3600 * 24 表示一天;1073741824 = 1024 * 1024 * 1024 表示 1 GB;而 2147483647 是 Java 等编程语言中 int 类型的最大值。

我把这些代码拿给我朋友一看,他嘲笑道:人家大佬写的魔数叫魔数,而你写的,只能叫烂代码。

的确,除非是上面那些大佬 / 前辈公认的、约定俗成的魔数外,我们在平时写代码的时候,尽量不要使用魔数,它会严重影响代码的可读性。

我们可以通过定义常量来给这些魔数加上 “注释”,比如:

intONE_DAY=86400;
intONE_GB=1073741824;
intMAX_INTEGER=2147483647;

这样就清晰很多了,也减少了我们输入错误的风险。

除了上面提到的魔数外,我还在网上看到了一些有实际意义的魔数,比如现代 3D 游戏之父约翰·卡马克在雷神之锤中的魔数:

i=0x5f3759df-(i>>1);

完全不敢相信,上面这行代码竟然可以快速计算一个数字的平方根的倒数!

在网上一查,还有很多论文专门研究这个东西:

0c0cdc88-3ef0-11ed-9e49-dac502259ad0.png

不得不感叹编程的魅力、数学的魅力啊!什么时候,我也能创造一个人尽皆知的魔数呢?

同事:“喂,别特么做梦了,快来搬砖!”

“来了来了,我再给你写几个魔数(烂代码)!” 0c347e0a-3ef0-11ed-9e49-dac502259ad0.png




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19181

    浏览量

    229216
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3572

    浏览量

    129258
  • MAP
    MAP
    +关注

    关注

    0

    文章

    49

    浏览量

    15129
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6974

原文标题:这代码谁写的?简直太可怕了!

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言与C++的区别

    在很大程度上,C++C的超集,这意味着一个有效的C程序也是一个有效的C++程序。
    发表于 09-16 10:20 1134次阅读

    C++map/mutimap容器

    map/multimap容器,也是一个关联式容器,底层通过二叉树实现。
    的头像 发表于 07-17 09:45 1036次阅读
    <b class='flag-5'>C++</b>之<b class='flag-5'>map</b>/mutimap容器

    MSP430之裸奔框架C++程序源码(菜农C++裸奔大法系列之一) 转载

    /*------------------------------------------------------------------------MSP430之裸奔框架C++程序源码(菜农C++裸奔大法)本程序主要表现了
    发表于 02-01 11:06

    大家谁有串口调试助手的源码,最好是C++的能发我一份吗,谢谢了

    大家谁有串口调试助手的源码,最好是C++的能发我一份吗,谢谢了大家谁有串口调试助手的源码,最好是C++的能发我一份吗,谢谢了
    发表于 01-28 22:24

    C++C/C++程序设计教程_C/C++概述

    C++基础知识,简要介绍了C++的一些简单知识,概念,函数
    发表于 12-25 10:15 0次下载

    GD32F207-HASH

    单片机GD32F207学习例程之HASH例程源码
    发表于 06-03 15:40 8次下载

    C++中命名空间的几大用法

    的: 命名空间定义了新的作用域。它们提供了一种避免名称冲突的方法。 c++ 中的命名空间通常用于避免命名冲突。尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具。 基于对众多C++项目
    发表于 09-28 18:31 0次下载

    VISUAL C++教程之VISUAL C++的安装和使用方法

    本文档的主要内容详细介绍的是VISUAL C++教程之VISUAL C++的安装和使用方法资料免费下载。
    发表于 12-27 16:32 19次下载
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安装和使用方法

    C++程序设计教程之C++的初步知识的详细资料说明

    C++程序设计教程之C++的初步知识的详细资料说明包括了:1. 从CC++,2 . 最简单的C++程序,3 .
    发表于 03-14 14:48 31次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>C++</b>的初步知识的详细资料说明

    C++程序设计的基础知识初步了解C++的资料免费下载

    本文档的主要内容详细介绍的是C++程序设计的基础知识初步了解C++的资料免费下载包括了:1 认识C++,2 C++的现状和发展,3 C++
    发表于 06-10 08:00 25次下载
    <b class='flag-5'>C++</b>程序设计的基础知识初步了解<b class='flag-5'>C++</b>的资料免费下载

    如何使用C语言实现动态扩容的string

    众所周知,C++ 中的string使用比较方便,关于C++ 中的string源码实现可以看我的这篇文章:源码分析C++的string的实现
    的头像 发表于 10-25 10:59 1996次阅读

    C++学习笔记之c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序开始介绍C++
    的头像 发表于 03-17 13:57 708次阅读

    浅谈C语言与C++的前世今生

    C++开发人员将有这些问题归咎于C,而C开发人员则认为C++过于疯狂。我觉得站在C的角度看C++
    发表于 05-26 09:27 444次阅读
    浅谈<b class='flag-5'>C</b>语言与<b class='flag-5'>C++</b>的前世今生

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《C++之旅》!
    的头像 发表于 10-30 16:35 803次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 544次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的