C 在constexpr中的new是怎麼實現的?

時間 2021-05-31 14:57:08

1樓:露公尺 Lumi

constexpr標記的函式,可以在執行時呼叫,也可以在編譯期完成。

你可以認為,如果它能在編譯期完成,那麼編譯器就會在編譯期去完成這個函式的計算。

為啥C++ 2020要求必須在該函式結束前就要釋放掉,我覺得應該是為了編譯器方便實現吧。如果你還能返回或者放在成員變數裡等在這個函式的上一層再用的話,衡量constexpr計算是否能完成的複雜度會指數級增加。因為你要衡量這些巢狀的邏輯是否能在編譯期完成計算。

更早的,之前都不支援呢。

2樓:暮無井見鈴

C++20 中的 new 表示式以及 allocator::allocate 可以在編譯期的常量求值中分配記憶體,但必須在同一段常量求值中釋放回去。執行期不會見到編譯期分配的動態記憶體。

執行期這些東西會呼叫 operator new 進行分配,但編譯期不會。

可以認為它沒有留到二進位制中可見的實現,實現全在編譯器中解決。

實際上 constexpr new 的提案中有提議過問題中構想的第二種方案( non-transient allocation ,非暫時分配),可以參考 P0784R7 及其較早的版本 P0784R5 。沒有接納非暫時分配的原因是分配記憶體的可變性處理上存在問題。

目前非暫時 constexpr 分配的工作並沒有停止,見 P1974R0 。雖然仍然不得不引入一些奇怪的東西。

基於值(或者說表示式)的反射提案(目前版本見 P1240R1 )可能仍然依賴非暫時 constexpr 分配。

不過我不清楚他們為什麼要讓一些函式返回帶所有權的 vector/string ,而非無所有權的 span/string_view 。如果採用後者的話,我懷疑就不需要非暫時 constexpr 分配了。

C 中的 constexpr函式 是不是不夠嚴謹

stay 你可以這樣理解,如果不用constexpr函式,有template cnt struct scale t integral constant cnt size t scale size t cnt inti 3 int cval scale t 3 value int val scale ...

請問巴西柔術中的old school和new school有什麼區別,技術上有什麼不同?

小蜀山賤僧 泰森是old school。雖然有很多技術但是視覺上像是硬打 梅威瑟是new school。極致利用比賽規則得分和戴拳套種種擂台特殊性取勝。新的bjj擂台之王 miyao曾經被人詬病只會躺在地上扯別人衣服看起來很沒有觀賞性。不過前幾天還是拿冠軍了。之前的bjj擂台王 roger Grac...

在C 中,如何實現跟native dll 中途的執行緒間通訊

SunnyCase 用 IntPtr 就沒問題了。C DllImport Dll1.dll CallingConvention CallingConvention.Cdecl static extern void test IntPtr running out UInt64 res static u...