[問題] constexpr 與 static const 的選擇

看板C_and_CPP (C/C++)作者 (HTYISABUG)時間6年前 (2019/06/12 02:54), 編輯推噓2(2027)
留言29則, 6人參與, 6年前最新討論串1/2 (看更多)
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 對於 constexpr 跟 static const 的差別不太了解 static const 在編譯時期時 常數會直接儲存在執行檔的 .data 這個 segment 裡 這是我的理解 問題是 constexpr 會檢查 expression 是否為編譯期常數 但檢查完後它資料是仍然放在 stack 中 還是也會放在 .data 中 然後我到底該不該用 constexpr 取代 static const ? 還是說其實根本可以 static constexpr ? 麻煩大家撥冗滿足我的好奇心,謝謝 ----- Sent from JPTT on my Samsung SM-A810YZ. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.191.102 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1560279267.A.F58.html

06/12 11:23, 6年前 , 1F
你如果編譯期就保證x=3了 那幹嘛還浪費記憶體去存x
06/12 11:23, 1F

06/12 11:24, 6年前 , 2F
直接把程式碼裡看到的x代換成3就好了
06/12 11:24, 2F

06/12 11:59, 6年前 , 3F
我會選擇用變數而不是純數字的原因是為了減少 magic numb
06/12 11:59, 3F

06/12 11:59, 6年前 , 4F
er,增加程式可讀性,也是提醒自己數字的用途
06/12 11:59, 4F

06/12 12:00, 6年前 , 5F
至於不用 define 的原因是常數我想放在 function 內提醒
06/12 12:00, 5F

06/12 12:00, 6年前 , 6F
自己用途以及作用範圍
06/12 12:00, 6F

06/12 12:12, 6年前 , 7F
而且你沒回答到問題欸
06/12 12:12, 7F

06/12 12:16, 6年前 , 8F
不 我已經在回答你的問題了
06/12 12:16, 8F

06/12 12:17, 6年前 , 9F
constexpr是放.data還是stack?都不是
06/12 12:17, 9F

06/12 12:20, 6年前 , 10F
因為真正的常數根本不需要放記憶體 編在指令裡就好了
06/12 12:20, 10F

06/12 12:20, 6年前 , 11F
constexpr要看情況 要保證不產生symbol可用匿名enum
06/12 12:20, 11F

06/12 14:21, 6年前 , 12F
你這樣講我就理解你的意思了,看來這部分是由編譯器優化
06/12 14:21, 12F

06/12 14:21, 6年前 , 13F
掉了
06/12 14:21, 13F

06/12 14:22, 6年前 , 14F
這樣的話我對 static const 跟 .data 好像有些誤解,那麼
06/12 14:22, 14F

06/12 14:22, 6年前 , 15F
.data 裡面存的不是常數的話會是哪些資料呢?
06/12 14:22, 15F

06/12 14:24, 6年前 , 16F
@kary(後略) 我的應用場合不太像是要用 enum ,而是定義
06/12 14:24, 16F

06/12 14:24, 6年前 , 17F
一些像螢幕長寬、基本速度之類的數值,這些是有可能重複
06/12 14:24, 17F

06/12 14:24, 6年前 , 18F
的,所以不能用 enum
06/12 14:24, 18F

06/12 14:53, 6年前 , 19F
匿名enum也可以有scope吧
06/12 14:53, 19F

06/12 15:08, 6年前 , 20F
.data是用來儲存有初始化的全域變數吧?
06/12 15:08, 20F

06/12 15:20, 6年前 , 21F
回原PO 你所指的常數應該是直接嵌在.text中的數字
06/12 15:20, 21F

06/12 15:20, 6年前 , 22F
但constexpr並不保證常數不會生成符號(佔據.rodata
06/12 15:20, 22F

06/12 15:20, 6年前 , 23F
空間) 而匿名enum因為規定是純右值 所以一定不會有
06/12 15:20, 23F

06/12 15:21, 6年前 , 24F
符號 然後我沒看懂你說會重複而不能用enum的問題
06/12 15:21, 24F

06/12 16:19, 6年前 , 25F
了解,這樣我理解兩者的差異了,另外那個重複什麼的問題
06/12 16:19, 25F

06/12 16:19, 6年前 , 26F
說理解錯誤,謝謝你的解答
06/12 16:19, 26F

06/12 16:20, 6年前 , 27F
更正,是我理解錯誤
06/12 16:20, 27F

06/13 03:11, 6年前 , 28F
可以寫static constexpr阿
06/13 03:11, 28F

06/13 13:13, 6年前 , 29F
原來是可以的嗎?謝謝提供答案
06/13 13:13, 29F
文章代碼(AID): #1S__ZZzO (C_and_CPP)
文章代碼(AID): #1S__ZZzO (C_and_CPP)