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