问题标签 [design-rationale]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++中复制省略背后的基本原理是什么?
C++ 标准允许(要求)编译器优化对复制构造函数的调用(在某些情况下)的原因是什么,即使它可能包含可观察到的副作用?
如果我没记错的话,“好像”规则已经允许编译器优化不必要的代码,只要生成的程序模拟标准中定义的抽象机器的可观察行为。
制定例外规则的动机是什么?它不会在语言中造成不一致吗?方便(或必要)吗?
format - IEEE 754:格式的基本原理:次正规数和正规数
有人可以澄清一下:
- 为什么次正规数的格式究竟是
±(0.F) × 2^-126
而不是±(1.F) × 2^-127
? - 为什么正常数字的格式是:
±(1.F) × 2^exp
而不是说±(11.F) × 2^exp
,或者说,±(10.F) × 2^exp
?
c - 从实数浮点数到整数的转换是否需要将该值截断为零以方便将代码从 Fortran 移植到 C?
C11, 6.3.1.4 实数浮点数和整数:
当实浮点类型的有限值转换为_Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。
“值被截断为零”的理由是什么?例如,为什么不“四舍五入到最接近的整数值,中间情况四舍五入为偶数”(IEEE 754,convertToIntegerTiesToEven(x)
)?
来自文档“国际标准的基本原理——编程语言——C”,修订版 5.10,2003 年 4 月:
6.3.1.5 真正的浮点类型(强调):
由于在前一种情况下,向零截断是 C 的适当设置,因此要求此类实现舍入以浮动会很昂贵。
6.5.5 乘法运算符(强调):
在 C89 中,涉及负操作数的整数除法可以以实现定义的方式向上或向下舍入;目的是避免在运行时代码中产生开销,以 10 检查特殊情况并强制执行特定行为。然而,在 Fortran 中,结果将始终向零截断,并且开销似乎对于数值编程社区是可以接受的。因此,C99 现在需要类似的行为,这应该有助于将代码从 Fortran 移植到 C。
c - 为什么 snprintf() 采用 size_t 大小限制,但返回打印的 int 字符数?
尊贵的snprintf()
功能...
它:
- 返回它打印的字符数,或者更确切地说,如果没有缓冲区大小限制,它会打印的数字。
- 以字符/字节为单位获取缓冲区的大小。
缓冲区大小如何有意义size_t
,但返回类型只是一个int
?
如果snprintf()
应该能够将多个INT_MAX
字符打印到缓冲区中,那么它肯定必须返回一个ssize_t
或一个size_t
并(size_t) - 1
指示错误,对吧?
如果它不应该打印多个INT_MAX
字符,为什么是bufsz
asize_t
而不是,比如说, anunsigned
或 an int
?或者 - 至少官方限制持有不大于 的值INT_MAX
?
cuda - 为什么 NVRTC 会从其他编译选项中“分离”此处的标头?
使用 NVRTC,您可以创建如下程序:
指定几个“here-headers”,或从您提供的字符串而不是从磁盘上的文件中获取的标题。
然后,您注册要从编译结果中访问的实体的名称(内核、设备全局变量)。
然后,你像这样编译你的程序:
现在,AFAICT,在程序的创建和编译之间您绝对无能为力。并且 - 为以后查找而注册的全局变量实际上并没有使用或依赖“here-headers”。
这引出了两个问题:
- 如果它们仅在编译期间有用,为什么我们要在创建时指定此处的标头?除了编译选项之外,将它传递给
nvrtcCompile()
. - 事实上,为什么在编译之前还要有一个程序呢?为什么不创建和编译:源、名称、要跟踪的命名表达式、编译选项和此处的标题?