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表示"弱符号
".
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现