考虑这个例子:
#include <iostream>
std::string& fn(std::string& str) {
str = "oh no!";
return str;
}
int main() {
std::string str = fn(str);
std::cout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题
为什么这个编译/为什么编译器不警告它?显然,在初始化之前str不应(在函数调用中)引用它。fnC++ 标准不阻止这种情况吗?如果是这样,在初始化变量之前引用变量的目的是什么?
这段代码在我尝试过的所有编译器(GCC、Clang 和 MSVC,如https://godbolt.org/z/jExWYW6b9所示)上编译良好,并且在 Godbolt 上的所有编译器上都存在段错误。但是,我可以编译此代码并在 M1 mac 上执行,而不会出现段错误Apple clang version 13.1.6 (clang-1316.0.21.2.5)(使用 Rosetta 2 在 arm64 和 x86_64 下进行测试,并打印oh no!到标准输出)。为什么这可以与 Apple Clang 一起使用并且不会出现段错误?我似乎无法在 Godbolt 上重现这一点。
我正在尝试加速一段将一维数组(过滤器)与二维数组的每一列进行卷积的代码。不知何故,当我用 numba's 运行它时njit,速度减慢了 7 倍。我的想法:
(在 Windows 10、conda 的 python 3.9.4、numpy 1.12.2、numba 0.53.1 上测试)
\n谁能告诉我为什么这段代码很慢?
\nimport numpy as np\nfrom numba import njit\n\ndef f1(a1, filt):\n l2 = filt.size // 2\n res = np.empty(a1.shape)\n for i in range(a1.shape[1]):\n res[:, i] = np.convolve(a1[:, i], filt)[l2:-l2]\n return res\n\n@njit\ndef f1_jit(a1, filt):\n l2 = filt.size // 2\n res = np.empty(a1.shape)\n for i in range(a1.shape[1]):\n res[:, i] = np.convolve(a1[:, i], filt)[l2:-l2]\n return …Run Code Online (Sandbox Code Playgroud) 我知道你可以声明函数参数类型,例如
(defun add-integer (a b)
(declare (integer a b))
(the integer (+ a b)))
Run Code Online (Sandbox Code Playgroud)
但是 DO 变量呢?例如,我想输入passes:
(defun bench ()
(do ((end (+ (get-internal-real-time) (* 5 internal-time-units-per-second)))
(passes 0 (+ 1 passes)))
((> (get-internal-real-time) end)
passes)
(sieve 1000000)))
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 进行编译时(declaim (optimize (speed 2) (safety 0))),我得到
; in: DEFUN BENCH
; (1+ PASSES)
;
; note: forced to do full call
; unable to do inline fixnum arithmetic (cost 2) because:
; The first argument is a …Run Code Online (Sandbox Code Playgroud)