你的m要设一个初始值,在int那里加上m=0
不知道你这个问题是否已经解决, 如果还没有解决的话:针对 Spectre 和 Meltdown 漏洞的修复方案将显著降低性能,在很大程度上抵消了过去十年在微架构方面所取得的进步。或许,现在是时候停止尝试如何让 C 语言代码变得更快,而是想办法设计出能够在快速处理上运行的编程模型。
我们有很多设计的例子,它们并没有专注于从传统的 C 语言代码中获得灵感。例如,高度多线程芯片(Sun/Oracle 的 UltraSPARC Tx 系列)不需要那么多的缓存来保持执行单元的满载。研究处理器已经将这个概念扩展到非常大量的硬件调度线程。这些设计背后的关键思想是,通过足够的高级并行度,我们可以将等待内存数据的线程挂起,并使用其他指令填充执行单元。这种设计的问题在于 C 语言程序往往没有繁忙的线程。
ARM 的 SVE(标量向量扩展)为程序和硬件之间的接口提供了另一个视角。常规向量单元提供固定大小的向量操作,并让编译器尝试将算法映射到可用的单元大小。相反,SVE 接口会让程序员描述可用的并行度,并依赖硬件将其映射到可用的执行单元数。要在 C 语言中使用这个相当复杂,因为自动向量器必须在循环结构体中推断出可用的并行度。通过函数式的映射操作为它生成代码非常简单:映射数组的长度就是可用的并行度。
看到这里,你是不是对“C语言”又有了一点新的认知呢~如果你喜欢这篇文章的话,动动小指,加个关注哦~
最后,如果你也想成为程序员,想要快速掌握编程,这里为你分享一个学习企鹅圈子!
里面有资深专业软件开发工程师,在线解答你的所有疑惑~编程语言入门“so easy”
编程学习书籍:
编程学习视频:
求一个数的k次方,递推可以实现,一次乘一次乘,当然可以先求出k-1次方,然后乘以自己,递归求解,设定初值,如果是1乘以自己返回1,否则返回n*fac(n, k-1)。
int fac(int n, int k) { if (k == 1) return n; return n* fac(n, k-1); } int main() { int n = 0; int k = 0; scanf("%d %d", &n, &k); int ret = fac(n, k); printf("%d", ret); return 0; }