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.d2)查看编译器生成的代码:
$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表示"弱符号".










