d加整128
原文
128整
,正128
未完成.
通用的任意固定大小
整数类型会是更好补充.
通过core.int128
公开.
cent/ucent
按core.int128
来暴露.
会支持128
位字面吗?还是必须等待importC
有int128_t
支持?
data.hi = lo >> 63
可加ulong
版构造器
.更清楚,在高位
移动.
为何要手动特化
模板?
Int128 opBinary(string op : "+")(Int128 op2) const
{
return Int128(add(this.data, op2.data));
}
这样,更可读,编译器
查找速度会更快
,而不是约束
,它需要求值
静态条件,此时,需要两次
.
更易阅读.
1,缺少文档单元测试
.2,请添加变更日志
项.
import
默认为私
,
bool opEquals(Int128 op2) const
{
return data.hi == op2.data.hi && data.lo == op2.data.lo;
}
可否删除,默认构
比较应工作.
我不明白为什么应该在Phobos
和druntime
中.与与其他系统编程语言
相比,把128
位类型作为库
已经很奇怪了(即使随后特殊处理它们来使用正确
的编译器内置函数
(很差了),),但如果这样,为何分成phobos
和druntime
两块?
应在druntime
中定义像样
的公开接口
,而不是从phobos
中复制.对如std.math和core.math
中的builtins/intrinsics
做了类似复制,这很糟糕.
我在想把Cent
包装成不同对齐构
,是否会使加载/存储
,构
数据更慢?为什么不在对齐
构上提供接口
而不是包装
它.
:把128
位类型作为库
已经很奇怪了
不是的.见std.complex
.它曾是内置
类型,但D已可按库类型
轻松实现.Int128
是很少
使用类型(是的,我知道有些人经常使用
它).在45
年的编程生涯
中,我从未使用过它.则为什么要让编译器
比需要的更复杂
呢?
拥有128
位整数会膨胀大量内部数据(加64位)
.那是相当昂贵
.
:为什么分成phobos
和druntime
两部分?
Druntime
提供了需要针对每个目标
调整的基础.Phobos
提供用户接口.std.complex
在火卫一中.还在druntime
和phobos
之间拆分了数学
例程.
其他语言
按内置类型
,是因为它们的元编程
设施不足或不存在
.
最后,在Phobos
中做表明
现在可用了.
你的经验并不普遍.128
位整数在密码学和生成随机数
等应用中非常有用.本实现对我用处不大
,因为它既不提供ucent
也不提供128
位字面.
可用哪些元编程工具
来支持128
位字面?这通过isIntegral
吗?现在可用正128
吗?size_t
变成128
位时会怎样
?会是别名
,还是D会拒绝支持
这样平台?为什么有人会在现有实现
上使用它?还会有128
位浮点结构吗?
我有一个置换
同余生成器RNG
实现,可简单支持128
位状态和/或值,如果ucent
支持字面,我需要的只是取消注释
两行.相反,我需要重要重构
来支持该点
.我不会等待
该模块支持正128
位整数,而是使用一些现有
的128
位正整数
代码或完全删除代码
.
我在想后者,因为std.random
的一部分(特别是uniform01
)无法工作,除非RNG
生成通不过isIntegral
或isFloatingPoint
的类型.
我很自豪实现比C++
干净得多.现在我必须削弱
它或让它像C++
一样丑陋
.我很失望
.
可这样:
alias creal = __c_complex_real;
alias cent = Cent;
我假设上面会,但最好只添加
此接口到该别名
,并置其他内部内容
为私有
,来兼容ABI
.
我最初想法是,弃用cent
时,会别名cent
为模仿它的库接口
,使其为编译器
上特殊类型
,因此特征
按内置类型
识别它.
我确实对各种代码
有很多经验,两者(密码/随机数)
都只占编写代码
的一小部分.是的,我都做过.
1,它是替代ucent
.
2,拥有字面
是非常简单的,只需制作使用CTFE
的int128!"92834572783456287346587324652834756"
模板来创建Int128
实例.都可写它,它只是atoi()
.我还没做,因为如果没批准Int128
,那是无意义的.
3,同样,我还没实现Uint128
.
则128
位指针有什么用呢?
可用重载
来完成.
感觉这很黑客
.如果有一天按内置类型
支持,即使是库实现
的.那为什么不呢?
为什么任何代码
都应有不必要
的摩擦
?
系统设计人员
可能会发现,在指针中编码
其他数据
很有用.RISC-V
及其计划中的RV128IISA
已在为此
做准备.128
位是必然的,而不是可能
的.
isIntegral
是模板.它明确拒绝除内置类型
外的所有整数类型
.
用户接口
应该是cent
关键字,添加模块
,仅仅因为它比编译器
接口,更容易实现cent
,这不充分.等待cent
.
现在我并不介意
这是在运行时
,但我认为,显然仅为了某些重载符号
目的,而成为Phobos
模块,这对BetterC
来说很奇怪
而且有点烦人
.
当我在语言
中加位域
时,我被阻止了,因为人们说应用元编程
来完成.当我用元编程
添加非常需要
功能时,它会因为没有内置
而被阻止.
我为core.int128
加了些编译器内置
函数,因此它几乎是内置
类型.唯一不利的是Cent
布局对BigEndian
不友好,并且库<->本地
间转换,导致生成代码
比匹配本地cent
布局时稍差.
即:导致与输入参数
就像ucent
时,生成相同代码.
// 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);
看起来是错的.交换高低
字段来不及了.
为了一致性,加
this(U lo, U hi)
使事情更糟糕.
使用位域
,你正给语言推动
全新语义.cent
另一方面,已经在规范
中.此外,cent
从规范
角度看,比位域
更简单.
说白了,问题不在于实现是DRuntime
还是内部编译器
.cent
都可以.只是从用户
角度看,它需要成为
语言功能.
如果达成共识,从规范中删除cent
,则会承认该模块给Phobos
(当然细节正确了).
我(在此例
)说加它,但与druntime
中的其他功能
放在一起.druntime
和dmd
在语义上是同一个项目,因此atomics
和arrayOp
等等在druntime
中,我认为128
位整数是基础,必须放在druntime
中.
不是真的,没人用Cent
,因为对齐
问题阻止了该PR
.
我不记得int128
是,在我最后一轮跨平台测试
之前还是之后.应再次运行
来查看在sparc64-solaris
上通过了多少int128
.我希望一切
都通过,因为库类型和例程
是字节序无关
的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现