国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

生動形象解釋strict-aliasing規(guī)則的寓言故事一則

2023-06-29 22:29 作者:雙笙子佯謬  | 我要投稿

有一天,一個叫做指針的小女孩去參觀了一個名為“洗佳佳”的神奇工廠,那里生產(chǎn)各種各樣的數(shù)據(jù)。指針很好奇,他想看看工廠里都有什么。進門時一個自稱“iso管委會”的工作人員攔住了他,說: 工廠里的數(shù)據(jù)是有類型之分的,你如果需要訪問工廠里某個類型的數(shù)據(jù),那你就得拿著那個類型的通行證。指針說: 我覺得int類型最常用,我想要申請一個int通行證。工作人員打了個電話給管委會的領(lǐng)導,批準了,于是工作人員拿出一張白卡,拿出int圖章印了上去,說: 這就是你的通行證了,你只能用它訪問int類型的數(shù)據(jù),如果你需要訪問其他類型的數(shù)據(jù),請再次和我們聯(lián)系,我們會幫你再做一份不同類型的通行證的。他拿著通行證,上面寫著“int”,表示他有訪問int類型的數(shù)據(jù)的權(quán)限。 進入工廠后,指針在整型車間找到了一個叫做int的數(shù)據(jù),它是一個4字節(jié)的整數(shù)。指針用他的int通行證訪問了這個int數(shù)據(jù),沒有問題。我申請的就是int通行證,int通行證訪問int類型是完全沒問題的,他心想。 他查閱員工手冊,發(fā)現(xiàn)int通行證不僅可以訪問int數(shù)據(jù),也可以訪問其他類型的數(shù)據(jù),前提是他必須遵守一個規(guī)則:strict-aliasing。 strict-aliasing的規(guī)則是這樣的:指針只能訪問和他通行證上相同類型的數(shù)據(jù),或者是一個該類型的超集,比如一個包含該類型的結(jié)構(gòu)體(struct/class)或聯(lián)合體(union)。如果指針想要訪問一個更小的類型,或者是一個不同的類型,他必須重新領(lǐng)取一張通行證,而不是對通行證進行涂改,否則他會被抓住并趕出工廠。例如int通行證不能用于訪問short,但是可以訪問unsigned int。另外,char和unsigned char是兩個特例,用任何類型的通行證都可以訪問。 指針找到了一個叫做short的數(shù)據(jù),它是一個2字節(jié)的整數(shù),指針想用他的int通行證訪問這個short數(shù)據(jù),但被工作人員拒絕了。他覺得這個規(guī)則很奇怪,他想知道為什么管委會要這樣限制他。他接下來決定去試試看能不能破壞這個規(guī)則,看看會發(fā)生什么。 然后,他發(fā)現(xiàn)了一個門牌上寫了char[4]的房間,打開一看,里面有4個搖籃,分別睡著4個char小孩,呆呆地看著他。指針想要訪問這個數(shù)據(jù),但是他沒有換通行證,因為他覺得這樣太麻煩了。他覺得反正我的通行證int是4字節(jié)的,用于訪問同樣是4字節(jié)的char[4]應該沒問題吧?他拿起通行證來觀察,發(fā)現(xiàn)通行證正面雖然寫著“int”,背面卻淡淡寫著“char”,他覺得蹊蹺,查了員工手冊才知道,原來洗屁屁工廠的每個通行證背面都印有char,意味著每一張通行證都可以當成char通行證使用。于是他把通行證翻了個面,當成char通行證用,訪問了這4個char數(shù)據(jù),沒有被發(fā)現(xiàn)。之所以開了這個后門或許是為了方便有時候需要把數(shù)據(jù)作為字節(jié)處理,例如把網(wǎng)絡收發(fā)包得到的char緩沖區(qū)當成任意符合類型去處理,他心想。 指針很高興,他覺得自己很聰明。他繼續(xù)尋找其他類型的數(shù)據(jù),試圖用他的通行證訪問它們。他找到了一個叫做unsigned int的數(shù)據(jù),它是一個四字節(jié)的無符號整數(shù)。指針想要訪問這個數(shù)據(jù),但是他沒有換通行證,因為他覺得這樣太麻煩了。他覺得反正我的通行證int是4字節(jié)的,用于訪問同樣是4字節(jié)的unsigned int應該沒問題吧?他偷偷地拿出水筆,在通行證上的“int”字樣前潦草地寫上“unsigned”前綴,改成了“unsigned int”,訪問了這個unsigned int數(shù)據(jù),沒有被發(fā)現(xiàn)。 他后來翻看員工手冊,才知道,原來每次派發(fā)整數(shù)類型的通行證時,都會附贈一張貼紙,貼紙上寫著unsigned,把unsigned貼紙貼在通行證上作為前綴,即可訪問整數(shù)的無符號版本的數(shù)據(jù)。而他剛才隨手把那貼紙扔了,自己寫上unsigned也達到了同樣的效果。之所以開了這個后門或許是為了無符號和有符號類型轉(zhuǎn)換的方便起見,他心想。 他來到精加工車間,發(fā)現(xiàn)里面都是一些結(jié)構(gòu)體類型,他看到一個結(jié)構(gòu)體struct C { int i; short s; };他想要頂撞一下規(guī)則,于是拿著int通行證去訪問這個結(jié)構(gòu)體的數(shù)據(jù),他本以為會像剛才那樣遭到阻攔,卻不料成功訪問了,沒有被工作人員阻止。原來根據(jù)規(guī)則,只要結(jié)構(gòu)體或聯(lián)合體的成員中含有一個通行證上的類型,也是可以訪問的。這應該是出于有時候需要取成員變量指針的方便,他心想。 指針更加高興了,他覺得自己很厲害。他繼續(xù)尋找其他類型的數(shù)據(jù),試圖用他的通行證訪問它們。他找到了一個叫做float的數(shù)據(jù),它是一個4字節(jié)的單精度浮點數(shù)。指針想要訪問這個數(shù)據(jù),但是他沒有換通行證,因為他覺得這樣太麻煩了。他覺得反正我的通行證int是4字節(jié)的,用于訪問同樣是4字節(jié)的float應該沒問題吧?他從背包里掏出一款“reinterpret_cast牌”的修正帶,偷偷地把他的通行證上的“unsigned int”字樣涂掉,改成了“float”。他拿著篡改的通行證訪問了這個float數(shù)據(jù),他違規(guī)的行為沒有被發(fā)現(xiàn)。 指針非常高興了,他覺得自己無所不能。但是就在這時候,一聲巨響打破了工廠的平靜。原來,指針在訪問float數(shù)據(jù)時,不小心改變了它的值。這個float數(shù)據(jù)正好是工廠里最重要的數(shù)據(jù)之一,它控制著工廠的運轉(zhuǎn)。由于指針改變了它的值,而工廠管委會覺得自己只發(fā)過int的通行證,認為不會有人修改過這個float值,因為float值只有頒發(fā)了float通行證才能修改。并不知情的工程師想當然地拿著錯誤的float數(shù)據(jù)進行運算,導致工廠出現(xiàn)了嚴重的故障,并且開始爆炸。 指針嚇壞了,他想要逃跑,但是已經(jīng)來不及了。工廠里所有的安保人員都發(fā)現(xiàn)了指針,并且追捕他。指針被抓住了,并且被嚴厲地批評教育的一番。

經(jīng)歷了這一次的教訓,他認識到了隨意用reinterpret_cast涂改通行證的危險。一位名叫“本賈尼·斯特勞斯特盧普”的安全人員告訴他,如果想要安全低在float和int之間按位轉(zhuǎn)換,可以用以下這些方法: 1. 聯(lián)系一名叫做std::launder的清潔人員,他會幫你重新打印通行證,由于他會利用對講機通知管理人員進行調(diào)度,所以他幫你涂改通行證是安全的。 2. 當你所在的工廠老板是“GNUC”時,可以走進辦公室對他說一句-fno-strict-aliasing,開明的他就會幫你廢除這個規(guī)則,strict-aliasing規(guī)則廢除后,通行證就可以隨意涂改,但由于每對通行證之間都可能指向同一個對象,管理人員不得不假定每一個指針都是aliasing的情況,所以也會妨礙到管理人員對工程的排班和優(yōu)化,對工廠流程效率產(chǎn)生負面影響。 3. 還可以用一臺叫做std::bit_cast的“重塑機”進行轉(zhuǎn)換,不過他和,std::bit_cast需要把float對象塞到機器里,并吐出int對象,而不是插入指向float的通行證,他內(nèi)部是通過把源類型用memcpy逐字節(jié)拷貝到unsigned char暫存,然后重新reinterpret_cast成目標類型讀取的,由于。 4. 可以用一個聯(lián)合體union { int i; float f; }進行轉(zhuǎn)換,抽象來說是由于規(guī)則說通行證可以訪問聯(lián)合體的成員,因此可以借助聯(lián)合體作為橋梁來進行轉(zhuǎn)換,具體來說是因為聯(lián)合體創(chuàng)建時,管理人員就知道這兩個類型之間可能產(chǎn)生按位轉(zhuǎn)換,從而對結(jié)構(gòu)體內(nèi)的所有成員留個心眼,不會產(chǎn)生調(diào)度事故。 經(jīng)過一頓安全教育后,指針害怕極了,他再也不敢亂動不兼容類型的數(shù)據(jù)。有一次指針需要修過一個float值,有了上次的教訓,他不敢直接拿著int通行證修改float的值。于是他找來一位名叫std::launder的專業(yè)清潔工,只見清潔工拿起int通行證,在上面進行了一波“洗刷刷洗刷刷”,于是就把通行證上int的水印去掉了。然后清潔工打了個電話給管委會,申請報備了float的訪問權(quán)限,經(jīng)過管委會簽字同意后,才往“洗刷刷”刷干凈的通行證印上“float”的字樣。管委會說,給,這是你船新的float通行證,用這張官方報備過的通行證,就可以安全訪問float值了。指針用float通行證修改了float,這時另一個指針也想修改同一個float值,他也申請了一份float通行證。管委會發(fā)現(xiàn)當前批出去了兩份float通行證,于是派出安全專家維護float車間的秩序,讓指針和另一個指針有序訪問float值,工廠沒有發(fā)生故障,今天又是和平的一天。

生動形象解釋strict-aliasing規(guī)則的寓言故事一則的評論 (共 條)

分享到微博請遵守國家法律
湘西| 凤山市| 获嘉县| 广平县| 久治县| 吉木乃县| 麦盖提县| 梁平县| 微山县| 台江县| 武川县| 库伦旗| 全椒县| 通许县| 松溪县| 永定县| 泌阳县| 延津县| 徐水县| 隆回县| 于都县| 青州市| 北海市| 涡阳县| 临夏市| 陇川县| 崇左市| 赫章县| 蓬莱市| 贞丰县| 衢州市| 巧家县| 肥乡县| 栾城县| 遂昌县| 茂名市| 保山市| 镇巴县| 博乐市| 宣武区| 右玉县|