0

我正在实现一个代码生成器,它为 x = y + w + z 或 A = B*C + D 或其他类型的每个线性代数表达式生成特定代码。每个表达式都分配有一个唯一的无符号长 id,有时我需要将此 id 包装为一个唯一的函数名称。

我发现了一个类似的问题,但无法将解决方案转换为我的问题,因为我还必须用 C++ 编写此代码,并且有效的 url 名称与有效的 C99 函数名称不同。我真的不知道从哪里开始!

编辑:我确实忘了提到一个函数可以分配多个 64 位 ID,因此将 ID 转换为字符串并连接字符串可能会导致函数名太大而无法由所有编译器处理

编辑2:好的,我可能不够精确。我正在生成 OpenCL 代码,生成的目的是删除临时代码并减少内核启动时间。出于某种原因,opencl 基于 C99,但某些编译无法处理很长的内核名称(因此我有一些构建错误。)考虑到所有可能性(标量类型、运算符、内联函数等),64 位的 ID 是勉强够了,但我觉得还是够了

vec0 = vec1+vec2 has for example ID 1912142123
vec1 = vec0-vec2 has for example ID 3312098234
vec2 = vec0*scal has for example ID 329084089

这三个操作可以放在同一个内核中。我想为生成的代码生成内核名称,_1912142123_3312098234_329084089 对于某些编译器来说可能太长了。

希望现在更清楚

4

1 回答 1

2

以下算法使用 n 位转换数字,其中 n 是有效字符的数量:

char *digs = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabzdefghijklmnopqrstuvwxyz_";
int n = strlen(digs);

long id = 1912142123;
char buffer[16];
int i = 0;
do
    buffer[i++] = digs[id%n];
while((id /= n)>0);
buffer[i] = 0;

digs 字符串应包含所有有效字符。在此示例中,“1912142123”将转换为“gZEzm1”

于 2012-12-30T18:02:44.973 回答