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