c static cast向下轉換後為什麼還可以正常執行?

時間 2021-05-30 19:28:24

1樓:徐辰

假設你住進一家旅館,忽然你發現隔壁房間的門開著,然後你就把一部分行李放到了那裡,睡了一晚之後:

你一定能找到放在隔壁的行李。

你一定不能找到放在隔壁的行李。

能不能找到取決於旅館工作人員的心情。

你覺得哪個是正確答案?

2樓:Xi Yang

非法操作又不是說必須立即就死。

實際上,程序的堆分配器都會有富裕的。你越界一點很可能並不會寫到本程序的外面,而是寫到了空餘空間裡,那當然不會立即就死,只是會寫到別的資料結構的位置。而如果你沒有使用另外的堆記憶體,甚至程式就不會死。

關於調成員函式,沒有任何機制阻止你使用非法的物件例項去調(非虛的)成員函式,直到你真的訪問非法物件例項的內容把你弄死,或者當場不死,但攪亂了其它物件的內態。因為(非虛的)成員函式呼叫和調乙個普通的函式沒有任何區別,除了this傳參有可能在特定暫存器上。

甚至像這樣:

class Van

}int main()

雖然非法,但很可能是可以執行的。

3樓:qian港

CRTP 的向下轉換,宣告再父類,發生在子類,轉換發生時,子類物件已經構造過了,所以是安全的(前提是轉換後不能呼叫子類不存在的方法或資料成員)

然而,你的第乙個main函式裡的轉換會引起UB ,是因為基類指標指向基類物件,卻在後面使用轉換操作,把基類指標轉換為子類指標,但是,這個指標指向的是基類物件,基類物件中並沒有子類物件的成員函式和資料,所以後續對子類成員的訪問都是錯誤的。

看這個。

原因類似。

C++ 編譯器對於普通成員函式的呼叫,會處理一下,類似

return_type func_name(class_type*,其它形參…)

所以,對不涉及到成員資料的呼叫一般不會報錯,對於涉及到資料成員訪問的函式呼叫是否報錯,取決於訪問的資料成員方式和這個資料成員的記憶體位址是否越界。

能執行是因為 ,你向C++申請的記憶體和C++向作業系統申請的記憶體不一樣大。

比如在 linux 中(我的ubuntu18-64),C++一次向作業系統申請33頁記憶體塊(每頁4kb),這個記憶體大小一般來說是要比構造物件所需的記憶體大,因此向下轉換一般也不會越界,所以能執行。

如果構造的物件正好在記憶體塊邊緣,向下轉型可能就直接越界報錯了

4樓:MaxwellGeng

首先反對說這是設計缺陷的論點。馮諾依曼架構確定了資料和邏輯是永遠不分離的,換而言之只要是實時的型別判定就一定要額外的不可接受的效能損耗。

而且這也不是缺陷,所謂的「導致問題」也是在甩鍋。當程式因為強轉了不恰當的指標型別時一定是因為設計模式的嚴重缺陷,靠語言標準也不可能解決,但凡工程經驗豐富一點都不會妄圖在語言標準層面解決實際問題然後說「萬一出問題了怎麼辦」這樣的話,說白了就是你怎麼不想想這個地方為啥會出現不相關型別的強轉呢?

高精度型別資料向下轉換為低精度型別資料時可以採用那兩種方式?

聶永真 1 在32位機上,int型和unsignedint型都是32位的 4個位元組 2 enum會跟據最大值來決定型別,一般來說為int型,如果超出int型所能表示的範圍,則用比int型大的最小型別來表示 unsigned int,long 或者unsigned long 3 關於型別的大小。一般...

怎麼理解線性轉換和非線性轉換?

chenxingwei 首先你對非線性的理解是錯的。比如說向量 同時有矩陣 相乘之後變為 維度改變了,但是這個是線性變換。若是沒有非線性啟用函式,神經網路就程式設計下面這樣了 為第一層輸出 是第二層輸出,實際上上式中可以設 這樣 也就是二層的神經網路跟一層的是一樣的,類似於線性回歸。若是沒有非線性啟...

有沒有向下發力的拳法?

張飛結 中國的有 劈,砍,拍,栽,採,挒。泰拳 砸肘,砸膝 空手道 只知道劈腿,其他的不了解 綜合格鬥 地面砸肘 拳擊裡面沒有向下的打擊 Eason Fu 形意拳講究爭力,有向上的勁就得一定要有向下的勁。所以有向上發力的一定會有向下發力的 1鑽拳,後手就在向下發力。2雞形3馬形這個有點像擺拳,但方向...