C_and_CPP 板


LINE

平常真的很少用union 所以當要用的時候還是查了一下 https://en.cppreference.com/w/cpp/language/union S s = {0x12345678}; // initializes the first member, s.n is now the active member // at this point, reading from s.s or s.c is undefined behavior 诶, 這不就是常看到union的標準用法嗎? 於是我再找找 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Ru-pun 恩....真的是undefined behavior.....完全顛覆我之前對union的認知 原來看到這種union { struct{} , array;} 全部都是UB... 想問一下 1. 即使他是 書本上的UB 但是不是可以說 所有已知compiler實作上都讓他效果一致 也就是常用的那套手段也沒什麼問題, 真的這樣寫 也不用太苛責? 2. 如果真的不想寫出UB 的程式碼, 是不是只能用reinterpret_cast 例如 union Endian{ int a; char b; }; 改用 int a = 1; char b = *(reinterpret_cast<char*>(&a)); 對於reinterpret_cast每當用 都很怕是UB, 有沒有什麼通則可以快速確認是否轉型是UB呢? 以上 (今天才知道union 這樣寫是UB, 實在很震驚) --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.12.193.155 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1592238947.A.863.html ※ 編輯: lovejomi (39.12.193.155 臺灣), 06/16/2020 01:00:08
1F:→ loveme00835: 你的認知應該是從 C 語言來的, 所謂的 active member 06/16 02:09
2F:→ loveme00835: 就是已經建構好的物件, 如果你要改用另外一個物件就 06/16 02:09
3F:→ loveme00835: 必須要先解構當前的 active member 再去建構另一個, 06/16 02:09
4F:→ loveme00835: 在 C++ 裡所有物件都要經過建構才能用, 只有將指標轉 06/16 02:09
5F:→ loveme00835: 型無視這個規則的都是 UB 06/16 02:09
6F:→ loveme00835: 對於 non-class object 也是同理, 建構子/解構子一整 06/16 02:12
7F:→ loveme00835: 套流程缺一不可 06/16 02:12
8F:→ loveme00835: 如果懶得自己處理就改用 std::variant 吧 06/16 07:34
9F:→ lovejomi: 可是primitive type要怎麼建構解構(syntax)? 06/16 09:49
10F:→ lovejomi: 如果要這樣 那之前在C work的union寫法 在C++是不是無法 06/16 09:50
11F:→ lovejomi: 使用, 如我舉例的Endian 例子...連primitive type也UB? 06/16 09:50
12F:→ lovejomi: https://ideone.com/FjHpL0 這樣寫卻沒有建構子被呼叫 06/16 09:51
13F:→ lovejomi: 合理嗎@@ 這樣我補上解構 不就不對稱了 06/16 09:51
14F:→ loveme00835: https://bit.ly/3d22Vlr 參考 [class.union]/6.3 還 06/16 10:50
15F:→ loveme00835: 有 06/16 10:50
16F:→ loveme00835: [class.union]/7 06/16 10:51
17F:→ loveme00835: https://wandbox.org/permlink/q3ZZFikhmqHmmFSK 06/16 11:05
18F:→ lovejomi: u.i.~int_t(); 我有私底下這樣寫但實在從來沒看過 06/16 11:18
19F:→ lovejomi: 但這也證明了 endian那種用法在C++完全是個錯誤? 06/16 11:18
20F:→ lovejomi: 但也像我第一個問題講的 這種UB真的是無法接受的嗎? 06/16 11:19
21F:→ lovejomi: 您的例子 透過placement new才會有建構子呼叫 06/16 11:20
22F:→ lovejomi: 如果一開始就要用 u.s 該怎麼辦呢 06/16 11:21
23F:→ lovejomi: https://wandbox.org/permlink/fmObYFTkDu6k6v3k 06/16 11:24
24F:→ lovejomi: 是不是 要調整s為第一個 並且 在 {{一定要寫}} ? 06/16 11:25
25F:→ loveme00835: UB 是灰色地帶, 只要你確定使用的編譯器行為會如你預 06/16 11:26
26F:→ loveme00835: 期, 那 UB 就只是可攜性比較差而已. 很多低階的記憶 06/16 11:26
27F:→ loveme00835: 體操作都是 UB 要靠標準慢慢補完. 可以參考 [P0593] 06/16 11:26
28F:→ lovejomi: 恩 那 沒跑到建構子是不是也是可接受? 06/16 11:50
29F:→ loveme00835: 當然不是這樣說 0rz 你沒有跑完 ctor 自然連 dtor 也 06/16 12:51
30F:→ loveme00835: 不會跑, 尤其是對有 side-effect 的 ctor 來說更是一 06/16 12:52
31F:→ loveme00835: 定要呼叫 06/16 12:52
32F:→ lovejomi: 我對side effect這詞用在這領域沒什麼感覺,可否給我一 06/16 19:18
33F:→ lovejomi: 些延伸資訊呢 謝謝 06/16 19:18
34F:→ loveme00835: 偶覺得你還是先把基礎打好 06/16 20:17
35F:推 CoNsTaR: 想要有保障就用 inheritance,不要用 union 啊 06/21 11:02
36F:→ CoNsTaR: 要用 union 就要自己人腦生成 induction principles 和 06/21 11:07
37F:→ CoNsTaR: 檢查所有 introduction/elimination 06/21 11:07







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP