gpt4 book ai didi

d - 编译时函数的内存

转载 作者:行者123 更新时间:2023-12-02 08:46:11 25 4
gpt4 key购买 nike

我想延迟计算函数。由于计算返回值的成本很高,因此我必须使用记忆化,特别是对于被调用的子函数,否则计算的时间复杂度会呈指数级增长。我需要编译时的结果。 (我正在编写一个库,它根据提供的字符串提供各种编译时模板。)所以简而言之,我需要在编译时进行内存。

std.function.memoize 不适用于 CT,所以这是不可能的。DMD和LDC还不够聪明,无法内存纯函数,至少这是我对简单纯函数的实验结果:我测试它是否缓存结果的方式:

使用简单的参数:

int sumN(int n) pure {
int result = 0;
for (int i = 0; i<=n; i++) result += i;
return result;
}

void main() {
enum sumMany = sumN(2000000);
enum sumMany2 = sumN(2000000);
writeln(sumMany, " ", sumMany2);
}

使用模板参数:

int sumN(int n)() pure {
int result = 0;
for (int i = 0; i<=n; i++) result += i;
return result;
}

void main() {
enum sumMany = sumN!2000000;
enum sumMany2 = sumN!2000000;
writeln(sumMany, " ", sumMany2);
}

对编译进行计时(调用 sumN 一次与两次):

time dmd -O -release -inline -boundscheck=off repeatpure.d

time ldc2 -O5 -release -inline -boundscheck=off repeatpure.d

当我在源代码中包含两个枚举时,编译时间总是两倍长。

有什么办法可以内存CT功能吗?

最佳答案

具有所有相同参数的模板只能实例化一次,因此您要做的就是使结果成为模板本身内部的常量值(在本例中为枚举)。

你的模板参数函数只会被实例化一次,但它会在你每次执行时运行。创建一个仅运行一次的辅助函数:

template sumN(int n) {
int helper() {
int result = 0;
for (int i = 0; i<=n; i++) result += i;
return result;
}

// this is run once per unique argument group
enum sumN = helper();
}

void main() {
// so both of these now reference the same constant
enum sumMany = sumN!2000000;
enum sumMany2 = sumN!2000000;
writeln(sumMany, " ", sumMany2);
}

这并不完全是内存,但它可能足以满足您的需要 - 请注意,如果您注释其中一个 sumMany,编译时间是相同的。

关于d - 编译时函数的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36251217/

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