0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++的hash_map源碼

Q4MP_gh_c472c21 ? 來源:程序員魚皮 ? 作者:魚皮 ? 2022-09-28 15:25 ? 次閱讀

前段時間,無意間在網(wǎng)上看到這么一張圖:


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

剛看到這段代碼時,我是比較吃驚的,作者竟然使用了一個英文單詞deadbeef來定義宏常量!

我本來以為只是一位幽默的程序員的小玩笑,但后來查閱資料才知道,上圖的這段代碼竟是 C++ 的 hash_map 源碼!而作者使用這個特殊的英文單詞也是 “別有用心”。

deadbeef 的英文直譯是“死牛肉”,但在編程領域中,它卻有著更深層的含義。給這個單詞加上0x、再轉換為大寫,就得到了一個典型的十六進制數(shù)字:0xDEADBEEF。

這個數(shù)字經(jīng)常用來標識新分配但是還未初始化的內存;在嵌入式系統(tǒng)中,也常常用它來表示程序崩潰或者出現(xiàn)了死鎖,比如運行在 32 位 PowerPC 處理器上的 IBM RS/6000 系統(tǒng)、Mac OS 系統(tǒng)。

那我不禁感到好奇,為什么選擇了這樣一個單詞,而不是 “FishPi” 之類的(開個玩笑,16 進制最多到 F)。

到網(wǎng)上查了一會,得到的結論竟然是:沒什么理由,它是一個“魔數(shù)”!

所謂魔數(shù),就是毫無理由、憑空出現(xiàn)、也不需要去解釋其含義的常量。就是這么任性!

除了 deadbeef 外,我還百度到了很多魔數(shù),比如:

0xBAADF00D ("bad food" 爛飯) 被微軟的 LocalAlloc(LMEM_FIXED)使用,在使用調試堆時指示未初始化的已分配堆內存;

0xDEADC0DE ("dead code" 死碼) 在 OpenWRT 固件中用作標記,在靜態(tài)固件的末尾表示要創(chuàng)建的 jffs2 文件系統(tǒng)的開始;

0xDEAD10CC ("dead lock" 死鎖) 用于表示 iOS 系統(tǒng)的閃退報告。

是不是感覺很神奇?也許這就是程序員的浪漫吧!

看到這里,我忍不住也去寫了幾個魔數(shù),大家來猜猜看是什么意思:

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

這幾個值都是我們寫代碼時經(jīng)常用的,84600 = 3600 * 24 表示一天;1073741824 = 1024 * 1024 * 1024 表示 1 GB;而 2147483647 是 Java 等編程語言中 int 類型的最大值。

我把這些代碼拿給我朋友一看,他嘲笑道:人家大佬寫的魔數(shù)叫魔數(shù),而你寫的,只能叫爛代碼。

的確,除非是上面那些大佬 / 前輩公認的、約定俗成的魔數(shù)外,我們在平時寫代碼的時候,盡量不要使用魔數(shù),它會嚴重影響代碼的可讀性。

我們可以通過定義常量來給這些魔數(shù)加上 “注釋”,比如:

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

這樣就清晰很多了,也減少了我們輸入錯誤的風險。

除了上面提到的魔數(shù)外,我還在網(wǎng)上看到了一些有實際意義的魔數(shù),比如現(xiàn)代 3D 游戲之父約翰·卡馬克在雷神之錘中的魔數(shù):

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

完全不敢相信,上面這行代碼竟然可以快速計算一個數(shù)字的平方根的倒數(shù)!

在網(wǎng)上一查,還有很多論文專門研究這個東西:

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

不得不感嘆編程的魅力、數(shù)學的魅力??!什么時候,我也能創(chuàng)造一個人盡皆知的魔數(shù)呢?

同事:“喂,別特么做夢了,快來搬磚!”

“來了來了,我再給你寫幾個魔數(shù)(爛代碼)!” 0c347e0a-3ef0-11ed-9e49-dac502259ad0.png




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19103

    瀏覽量

    228829
  • 嵌入式系統(tǒng)

    關注

    41

    文章

    3553

    瀏覽量

    129116
  • MAP
    MAP
    +關注

    關注

    0

    文章

    48

    瀏覽量

    15121
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6951

原文標題:這代碼誰寫的?簡直太可怕了!

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言與C++的區(qū)別

    在很大程度上,C++C的超集,這意味著一個有效的C程序也是一個有效的C++程序。
    發(fā)表于 09-16 10:20 ?1119次閱讀

    C++map/mutimap容器

    map/multimap容器,也是一個關聯(lián)式容器,底層通過二叉樹實現(xiàn)。
    的頭像 發(fā)表于 07-17 09:45 ?1003次閱讀
    <b class='flag-5'>C++</b>之<b class='flag-5'>map</b>/mutimap容器

    MSP430之裸奔框架C++程序源碼(菜農C++裸奔大法系列之一) 轉載

    /*------------------------------------------------------------------------MSP430之裸奔框架C++程序源碼(菜農C++裸奔大法)本程序主要表現(xiàn)了
    發(fā)表于 02-01 11:06

    大家誰有串口調試助手的源碼,最好是C++的能發(fā)我一份嗎,謝謝了

    大家誰有串口調試助手的源碼,最好是C++的能發(fā)我一份嗎,謝謝了大家誰有串口調試助手的源碼,最好是C++的能發(fā)我一份嗎,謝謝了
    發(fā)表于 01-28 22:24

    C++C/C++程序設計教程_C/C++概述

    C++基礎知識,簡要介紹了C++的一些簡單知識,概念,函數(shù)
    發(fā)表于 12-25 10:15 ?0次下載

    GD32F207-HASH

    單片機GD32F207學習例程之HASH例程源碼
    發(fā)表于 06-03 15:40 ?8次下載

    C++中命名空間的幾大用法

    的: 命名空間定義了新的作用域。它們提供了一種避免名稱沖突的方法。 c++ 中的命名空間通常用于避免命名沖突。盡管命名空間在最近的 c++ 代碼中廣泛使用,但大多數(shù)較舊代碼都不使用此工具。 基于對眾多C++項目
    發(fā)表于 09-28 18:31 ?0次下載

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

    本文檔的主要內容詳細介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費下載。
    發(fā)表于 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 .
    發(fā)表于 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++的現(xiàn)狀和發(fā)展,3 C++
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設計的基礎知識初步了解<b class='flag-5'>C++</b>的資料免費下載

    如何使用C語言實現(xiàn)動態(tài)擴容的string

    眾所周知,C++ 中的string使用比較方便,關于C++ 中的string源碼實現(xiàn)可以看我的這篇文章:源碼分析C++的string的實現(xiàn)
    的頭像 發(fā)表于 10-25 10:59 ?1982次閱讀

    C++學習筆記之c++的基本認識

    自這篇文章我們即將開始C++的奇幻之旅,其內容主要是讀C++ Primer的總結和筆記,有興趣可以找原版書看看,對于學習C++還是有很大幫助的。這篇文章將從一個經(jīng)典的程序開始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?691次閱讀

    淺談C語言與C++的前世今生

    C++開發(fā)人員將有這些問題歸咎于C,而C開發(fā)人員則認為C++過于瘋狂。我覺得站在C的角度看C++
    發(fā)表于 05-26 09:27 ?419次閱讀
    淺談<b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>的前世今生

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?778次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?514次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的