[問題] constexpr 與 static const 的選擇

作者: CarbonK (HTYISABUG)   2019-06-12 02:54:25
開發平台(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 ?
麻煩大家撥冗滿足我的好奇心,謝謝
作者: sarafciel (Cattuz)   2019-06-12 11:23:00
你如果編譯期就保證x=3了 那幹嘛還浪費記憶體去存x直接把程式碼裡看到的x代換成3就好了
作者: CarbonK (HTYISABUG)   2019-06-12 11:59:00
我會選擇用變數而不是純數字的原因是為了減少 magic number,增加程式可讀性,也是提醒自己數字的用途至於不用 define 的原因是常數我想放在 function 內提醒自己用途以及作用範圍而且你沒回答到問題欸
作者: sarafciel (Cattuz)   2019-06-12 12:16:00
不 我已經在回答你的問題了constexpr是放.data還是stack?都不是因為真正的常數根本不需要放記憶體 編在指令裡就好了
作者: KaryuuIssen (一閃)   2019-06-12 12:20:00
constexpr要看情況 要保證不產生symbol可用匿名enum
作者: CarbonK (HTYISABUG)   2019-06-12 14:21:00
你這樣講我就理解你的意思了,看來這部分是由編譯器優化掉了這樣的話我對 static const 跟 .data 好像有些誤解,那麼.data 裡面存的不是常數的話會是哪些資料呢?@kary(後略) 我的應用場合不太像是要用 enum ,而是定義一些像螢幕長寬、基本速度之類的數值,這些是有可能重複的,所以不能用 enum
作者: oToToT (屁孩)   2019-06-12 14:53:00
匿名enum也可以有scope吧
作者: james732 (好人超)   2019-06-12 15:08:00
.data是用來儲存有初始化的全域變數吧?
作者: KaryuuIssen (一閃)   2019-06-12 15:20:00
回原PO 你所指的常數應該是直接嵌在.text中的數字但constexpr並不保證常數不會生成符號(佔據.rodata空間) 而匿名enum因為規定是純右值 所以一定不會有符號 然後我沒看懂你說會重複而不能用enum的問題
作者: CarbonK (HTYISABUG)   2019-06-12 16:19:00
了解,這樣我理解兩者的差異了,另外那個重複什麼的問題說理解錯誤,謝謝你的解答更正,是我理解錯誤
作者: firejox (Tangent)   2019-06-13 03:11:00
可以寫static constexpr阿
作者: CarbonK (HTYISABUG)   2019-06-13 13:13:00
原來是可以的嗎?謝謝提供答案

Links booklink

Contact Us: admin [ a t ] ucptt.com