d的nan讨论4
我会远离快速数学
.但是,如果你想用它,就得靠你自己了,因为D假设IEEE
数学.
因此断定
可引入新的_未定义行为_
.
"快速数学"
,也因编译器
而异,有时会使事情变慢!
甚至需要它来提高性能
吗?不确定,因为只是矢量化
,无论是自动
的还是显式
的,都会带来更好的结果.至少,这是我使用LLVM
后端的经验.
最好不用-release
.
-release
唯一应该做的就是删除调试语句
.不多也不少.
是的.-release
出于多种原因应该*永远认真*
使用,但请阅读规范的该部分,规范:
第一个AssignExpression
必须求值
为真.如果没有,则断定
失败且程序进入无效状态
.
如果失败了,即使没有真正编译
进去,程序*仍然*
进入无效状态
.
一旦无效状态
,继续执行
程序是未定义的.
即优化器
可自由假设
断定都是正确
的,因为它向前移动,如果从未经过实际测试
,它可能会非常随机
.
默认不使用调试语句
.
显然,断定失败
后扔掉你的计算机
.
绝对地
.地下室里到处
都是敢于失败的垃圾电脑
.
DMD
有个开关,可以在断定
失败时插入暂停
指令.
-release
适合速度基准
测试的人.我根据几十年
的经验说话.
如果不在输出
中找
错误,更不可能在初化
为0时就找到它.
我还在此写过在不想使用
时退出时,NaN
的合法用途
.
它类似Unicode
中的"替换字符"
.我们有在看到无效代码点
时,触发异常
的经验.这是错误
的答案.大错特错,它是Phobos
版本2的动力
之一.
我已经和布鲁斯
谈过很多次了.
充分了解向量化
后,结论是,显式矢量化
通常是错误选择.它占用
了开发人员的时间,且好处很少.
LLVM
和GCC
都可利用的是assert(arg1 !is arg2);
,这么简单
的断言!然而其中有很重要的别名信息
.我喜欢断言
.
文档
应该直截了当地说"除非你在人为
的速度基准上作弊
,否则永远不要
使用它",-release
.
它应该重命名为-optimize-for-benchmark
.
并不可怕.只需要了解正在发生的事情.
合同
旨在支持正确性
,而不是帮助加剧漏洞
.
比较常见
用例是禁用合约/断言检查
.
问题是DMD
似乎不能
安全切换到禁用检查
.
我遇到"非法指令"
的经验是,他们只是假设
编译器有错误并产生了无效的机器代码
.此外,"hlt"
语义根本不终止任何事情,它只是等待下一个中断的触发
.它在用户空间
崩溃的唯一原因
是它需要访问0环
.
现在,使用UD2
了.
很确定,至少在x86
架构上,调用约定
是用户空间中的hlt
是向操作系统
发出表明程序已终止自身
的信号(通常不是正常
的,因为至少在Posix
上,正常终止
通常是通过退出(exit)
系统调用)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现