d加整128
原文
128整,正128未完成.
通用的任意固定大小整數(shù)類型會(huì)是更好補(bǔ)充.
通過(guò)core.int128公開.
cent/ucent按core.int128來(lái)暴露.
會(huì)支持128位字面嗎?還是必須等待importC有int128_t支持?
data.hi = lo >> 63可加ulong版構(gòu)造器.更清楚,在高位移動(dòng).
為何要手動(dòng)特化模板?
Int128 opBinary(string op : "+")(Int128 op2) const {return Int128(add(this.data, op2.data)); }這樣,更可讀,編譯器查找速度會(huì)更快,而不是約束,它需要求值靜態(tài)條件,此時(shí),需要兩次.
更易閱讀.
1,缺少文檔單元測(cè)試.2,請(qǐng)?zhí)砑幼兏罩卷?xiàng).
import默認(rèn)為私,
bool opEquals(Int128 op2) const {return data.hi == op2.data.hi && data.lo == op2.data.lo; }可否刪除,默認(rèn)構(gòu)比較應(yīng)工作.
我不明白為什么應(yīng)該在Phobos和druntime中.與與其他系統(tǒng)編程語(yǔ)言相比,把128位類型作為庫(kù)已經(jīng)很奇怪了(即使隨后特殊處理它們來(lái)使用正確的編譯器內(nèi)置函數(shù)(很差了),),但如果這樣,為何分成phobos和druntime兩塊?
應(yīng)在druntime中定義像樣的公開接口,而不是從phobos中復(fù)制.對(duì)如std.math和core.math中的builtins/intrinsics做了類似復(fù)制,這很糟糕.
我在想把Cent包裝成不同對(duì)齊構(gòu),是否會(huì)使加載/存儲(chǔ),構(gòu)數(shù)據(jù)更慢?為什么不在對(duì)齊構(gòu)上提供接口而不是包裝它.
:把128位類型作為庫(kù)已經(jīng)很奇怪了
不是的.見(jiàn)std.complex.它曾是內(nèi)置類型,但D已可按庫(kù)類型輕松實(shí)現(xiàn).Int128是很少使用類型(是的,我知道有些人經(jīng)常使用它).在45年的編程生涯中,我從未使用過(guò)它.則為什么要讓編譯器比需要的更復(fù)雜呢?
擁有128位整數(shù)會(huì)膨脹大量?jī)?nèi)部數(shù)據(jù)(加64位).那是相當(dāng)昂貴.
:為什么分成phobos和druntime兩部分?
Druntime提供了需要針對(duì)每個(gè)目標(biāo)調(diào)整的基礎(chǔ).Phobos提供用戶接口.std.complex在火衛(wèi)一中.還在druntime和phobos之間拆分了數(shù)學(xué)例程.
其他語(yǔ)言按內(nèi)置類型,是因?yàn)樗鼈兊脑幊淘O(shè)施不足或不存在.
最后,在Phobos中做表明現(xiàn)在可用了.
你的經(jīng)驗(yàn)并不普遍.128位整數(shù)在密碼學(xué)和生成隨機(jī)數(shù)等應(yīng)用中非常有用.本實(shí)現(xiàn)對(duì)我用處不大,因?yàn)樗炔惶峁﹗cent也不提供128位字面.
可用哪些元編程工具來(lái)支持128位字面?這通過(guò)isIntegral嗎?現(xiàn)在可用正128嗎?size_t變成128位時(shí)會(huì)怎樣?會(huì)是別名,還是D會(huì)拒絕支持這樣平臺(tái)?為什么有人會(huì)在現(xiàn)有實(shí)現(xiàn)上使用它?還會(huì)有128位浮點(diǎn)結(jié)構(gòu)嗎?
我有一個(gè)置換同余生成器RNG實(shí)現(xiàn),可簡(jiǎn)單支持128位狀態(tài)和/或值,如果ucent支持字面,我需要的只是取消注釋兩行.相反,我需要重要重構(gòu)來(lái)支持該點(diǎn).我不會(huì)等待該模塊支持正128位整數(shù),而是使用一些現(xiàn)有的128位正整數(shù)代碼或完全刪除代碼.
我在想后者,因?yàn)閟td.random的一部分(特別是uniform01)無(wú)法工作,除非RNG生成通不過(guò)isIntegral或isFloatingPoint的類型.
我很自豪實(shí)現(xiàn)比C++干凈得多.現(xiàn)在我必須削弱它或讓它像C++一樣丑陋.我很失望.
可這樣:
alias creal = __c_complex_real; alias cent = Cent;我假設(shè)上面會(huì),但最好只添加此接口到該別名,并置其他內(nèi)部?jī)?nèi)容為私有,來(lái)兼容ABI.
我最初想法是,棄用cent時(shí),會(huì)別名cent為模仿它的庫(kù)接口,使其為編譯器上特殊類型,因此特征按內(nèi)置類型識(shí)別它.
我確實(shí)對(duì)各種代碼有很多經(jīng)驗(yàn),兩者(密碼/隨機(jī)數(shù))都只占編寫代碼的一小部分.是的,我都做過(guò).
1,它是替代ucent.
2,擁有字面是非常簡(jiǎn)單的,只需制作使用CTFE的int128!"92834572783456287346587324652834756"模板來(lái)創(chuàng)建Int128實(shí)例.都可寫它,它只是atoi().我還沒(méi)做,因?yàn)槿绻麤](méi)批準(zhǔn)Int128,那是無(wú)意義的.
3,同樣,我還沒(méi)實(shí)現(xiàn)Uint128.
則128位指針有什么用呢?
可用重載來(lái)完成.
感覺(jué)這很黑客.如果有一天按內(nèi)置類型支持,即使是庫(kù)實(shí)現(xiàn)的.那為什么不呢?
為什么任何代碼都應(yīng)有不必要的摩擦?
系統(tǒng)設(shè)計(jì)人員可能會(huì)發(fā)現(xiàn),在指針中編碼其他數(shù)據(jù)很有用.RISC-V及其計(jì)劃中的RV128IISA已在為此做準(zhǔn)備.128位是必然的,而不是可能的.
isIntegral是模板.它明確拒絕除內(nèi)置類型外的所有整數(shù)類型.
用戶接口應(yīng)該是cent關(guān)鍵字,添加模塊,僅僅因?yàn)樗染幾g器接口,更容易實(shí)現(xiàn)cent,這不充分.等待cent.
現(xiàn)在我并不介意這是在運(yùn)行時(shí),但我認(rèn)為,顯然僅為了某些重載符號(hào)目的,而成為Phobos模塊,這對(duì)BetterC來(lái)說(shuō)很奇怪而且有點(diǎn)煩人.
當(dāng)我在語(yǔ)言中加位域時(shí),我被阻止了,因?yàn)槿藗冋f(shuō)應(yīng)用元編程來(lái)完成.當(dāng)我用元編程添加非常需要功能時(shí),它會(huì)因?yàn)闆](méi)有內(nèi)置而被阻止.
我為core.int128加了些編譯器內(nèi)置函數(shù),因此它幾乎是內(nèi)置類型.唯一不利的是Cent布局對(duì)BigEndian不友好,并且?guī)?lt;->本地間轉(zhuǎn)換,導(dǎo)致生成代碼比匹配本地cent布局時(shí)稍差.
即:導(dǎo)致與輸入?yún)?shù)就像ucent時(shí),生成相同代碼.
// struct Cent { ulong lo; ulong hi } version (LittleEndian): const tmp1 = *cast(ucent*)&c1; // mov (load) const tmp2 = *cast(ucent*)&c2; // mov (load) const tmp3 = tmp1 OP tmp2; // op return *cast(Cent*)&tmp3; // ret (已在正確寄存器)而這:
// struct Cent { ulong lo; ulong hi } version (BigEndian): const tmp1 = cast(ucent)c1.lo + (cast(ucent)c1.hi << 64); // mov+xor+ad[dc] (load) const tmp2 = cast(ucent)c2.lo + (cast(ucent)c2.hi << 64); // mov+xor+ad[dc] (load) const tmp3 = tmp1 OP tmp2;// op+mov return Cent(cast(ulong)tmp3, cast(ulong)(tmp3 >> 64)); // mov+ret更多移位.用
enum Cent One = {lo:1};替換
enum One = Cent(1);看起來(lái)是錯(cuò)的.交換高低字段來(lái)不及了.
為了一致性,加
使事情更糟糕.
使用位域,你正給語(yǔ)言推動(dòng)全新語(yǔ)義.cent另一方面,已經(jīng)在規(guī)范中.此外,cent從規(guī)范角度看,比位域更簡(jiǎn)單.
說(shuō)白了,問(wèn)題不在于實(shí)現(xiàn)是DRuntime還是內(nèi)部編譯器.cent都可以.只是從用戶角度看,它需要成為語(yǔ)言功能.
如果達(dá)成共識(shí),從規(guī)范中刪除cent,則會(huì)承認(rèn)該模塊給Phobos(當(dāng)然細(xì)節(jié)正確了).
我(在此例)說(shuō)加它,但與druntime中的其他功能放在一起.druntime和dmd在語(yǔ)義上是同一個(gè)項(xiàng)目,因此atomics和arrayOp等等在druntime中,我認(rèn)為128位整數(shù)是基礎(chǔ),必須放在druntime中.
不是真的,沒(méi)人用Cent,因?yàn)閷?duì)齊問(wèn)題阻止了該P(yáng)R.
我不記得int128是,在我最后一輪跨平臺(tái)測(cè)試之前還是之后.應(yīng)再次運(yùn)行來(lái)查看在sparc64-solaris上通過(guò)了多少int128.我希望一切都通過(guò),因?yàn)閹?kù)類型和例程是字節(jié)序無(wú)關(guān)的.
總結(jié)
- 上一篇: 试题 历届真题 翻硬币【第四届】【省赛】
- 下一篇: Cambridge IGCSE Chem