gpt4 book ai didi

c - 通过 C 中的函数传递常量

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:34 25 4
gpt4 key购买 nike

我有一些 C 函数,除其他外,它执行模运算。所以它看起来像

const int M = 641;

void func( ...parameters..) {
int x;

... some operations ...

x %= M;

... some more operations ...
}

现在,对我来说至关重要的是这里的数字 M 是一个常数。如果我不告诉编译器 M 是一个常量,那么我的性能会慢很多。

目前,我对我的函数 func( .. ) 非常满意,我想扩展它,以便它可以在不同的模数上工作。但同样,这里至关重要的是这些模数是固定的。所以我希望能够做类似的事情

const int arrayM[] = {641, 31, 75, 81, 123};

然后对于常量数组中的每个索引都有array_M[i]函数 func 的一个版本,比如 func_i,它是函数 func 的一个副本,但其中 array_M[i]取代了 M 的角色.

在实践中,我的常量数组 arrayM[]将由大约 600 个显式质数组成,我将以特定方式选择这些质数,以便 x % array_M[i]编译为非常快的模函数(例如梅森素数)。

我的问题是:我如何在 C 中执行此操作而不复制我的函数 func,并且每次都更改代码中的变量 M?

最后,对于CUDA代码,我想再问同样的问题。因此,如果我有一个 cuda 内核,在代码中的某个位置模数 M操作已执行,我想拥有同一内核的不同副本(每个索引对应一个 array_M )。

最佳答案

你可以使用这样的定义:

#define F(i,n)  void func_##i() { printf("%d\n",n); }

#include <stdio.h>

F(1,641)
F(2,31)
...

int main() {
func_1();
func_2();
}

从常量列表中获得相同的效果是可能的,但要复杂得多。参见 recursive macro .

关于c - 通过 C 中的函数传递常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com