const
(和in
)
考虑有 C 函数:
unsigned int foo(const unsigned int a);
const
对生成的代码没有影响,就好像代码通过编译一样,const
如果没有,什么都不会破坏const
——所以 C 编译器在编译时只使用它作为代码契约说明符。
是否有任何努力在 D 中编写uint foo(in uint a);
或uint foo(const uint a);
调用此函数?这是否可以帮助 D 编译器生成更有效的调用代码foo
,或者这将不起作用(至少对于值类型参数)?
ref
和out
有C函数
unsigned int bar(unsigned int *a);
我是否必须uint bar(uint* a);
在将其翻译为 D 时使用指针语法,或者我可以写uint bar(ref uint a);
(或者uint bar(out uint a);
,如果我知道这a
仅用于输出,来自文档bar
)?ref
和下是否还有其他隐藏机制out
,或者它们看起来只是简单的指针?out
当调用超出 D 范围时,D会生成“胶水代码”以将参数初始化为其默认值吗?
更新 1:我编写了简单的代码来测试如何在参数中处理ref
s 和out
s — 它们实际上至少对于int
s 来说似乎是普通指针,但out
在传递时不会重置为初始值 — C 端仍然可以读取它的值并修改它,所以它有效地表现得像ref
。我不确定,当我以这种方式使用东西时,是否会出现与 GC 相关的问题。
Update2:在函数结果中使用ref
而不是指针也可以按预期方式工作。const
仍然未经测试,我不知道如何检查它而不需要反汇编我的程序。