0
点赞
收藏
分享

微信扫一扫

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表示"​​弱符号​​".



举报

相关推荐

0 条评论