d的ctfe

d保证编译时执行下面吗?

auto genFactorials(int n)
{
  auto result = new int[n];
    result[0] = 1;
    foreach (i; 1 .. n)
    {
        result[i] = result[i - 1] * i;
    }
  return result;
}

  enum factorials = genFactorials(13);
  enum fact13th =  479001600;

void main()
{
  static assert(factorials.length == 13);
  static assert(factorials[$-1] == fact13th);
}

是否可断定代码程序中?如,可把它们放在中,然后取平方根.
编译时,按需执行值(或"表达式").(如果在编译时不可用,就无法执行,这是编译错误.)
该函数不是静态的,调用时返回的值是静态的.(函数代码可能不是编译执行,而是编译器的优化能力.)

编译器可能会按顺序编译它遇到的函数.是的,genFactorials()添加被到要在运行时(也)执行的代码中.
在D中,"枚举"代表显式常量.genFactorials()编译在时执行,必须在编译时已知该值.(如果编译函数延迟到了该点,它现在肯定会编译.)

void main(string[] args) {
  genFactorials(args.length);
}

D有个叫做"单独编译"概念:可单独编译程序的一部分.因此,如,程序第一个编译部分可调用后面编译部分.(第二个代码只需要链接第一个函数(D绑定).),编译时不能决定在程序中包含该函数.
只有最终创建程序的链接器才能决定.可能因连接器而异,或连接器选项而定.我不确定.

我很少使用两个工具来处理这些事情:
-反汇编器:objdump,obj2asm等.
-nm:提供有关程序部分(.o,.lib等文件)或在程序中找到的符号信息.
1)编译程序:

$dmd test.d

2)查看编译器生成的代码:

$objdump -d test>test.asm

_Dmain函数为空:

00000000000457bc <_Dmain>:
   457bc:    31 c0   xor %eax,%eax

(如果编译为extern(C),则叫genFactorials().本主题是关于支持函数重载所需的"修改名".)

00000000000456ec <_D6deneme13genFactorialsFNaNbNfiZAi>:
   456ec:    55          push   %rbp
   456ed:    48 8b ec    mov    %rsp,%rbp
   456f0:    48 83 ec 30 sub    $0x30,%rsp
//

3)看看nm:

$ nm deneme | grep genFactorials
00000000000456dc W _D6deneme13genFactorialsFNaNbNfiZAi

是的,W表示"弱符号".

posted @   zjh6  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示