- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
const
(和 in
)
考虑有 C 函数:
unsigned int foo(const unsigned int a);
const
对生成的代码没有影响,就像代码通过
const
的编译一样,如果没有
const
,什么都不会破坏— 因此 C 编译器在编译时仅将其用作代码协定说明符。
uint foo(in uint a);
或
uint foo(const uint a);
在 D 中调用这个函数?这可以帮助 D 编译器生成更有效的代码来调用
foo
,或者这将没有效果(至少对于值类型参数)?
ref
和
out
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
,或者它们只是看起来像的普通指针? D 会为初始化生成“胶水代码”
out
调用超出 D 范围时将参数设置为默认值?
ref
s 和
out
s 在参数中处理——它们实际上似乎是至少对于
int
的普通指针s,但是
out
传递时不会重置为初始值 - C 端仍然可以读取它的值并修改它,因此它的作用类似于
ref
.我不确定,当我以这种方式使用东西时,是否会出现与 GC 相关的问题。
ref
而不是函数结果中的指针也可以按预期方式工作。
const
仍然未经测试,我不知道如何检查它而不需要反汇编我的程序。
最佳答案
in
(与 const scope
相同)在 C 中不存在,因为 scope
在 C 中不存在。而 out
和 ref
在 C 中也不存在。不要将它们与 extern(C)
一起使用职能。如果您在 extern(C)
的参数中使用它们,编译器可能会报错。功能,但如果没有,我不会感到惊讶。如果它碰巧奏效了,那你就“幸运”了。它可能随时停止工作。如何ref
和 out
实现的是编译器的实现细节。通常,您应该只在 extern(C)
上使用修饰符。 C 中实际存在的函数。D 的编译器不会做任何魔法来使 D 的东西在 extern(C)
上工作。功能。它预计 extern(C)
函数成为具有 C 具有的功能的 C 函数,而不是 D。
我知道的唯一两个异常(exception)是 pure
和 nothrow
,因为它们根本不影响调用约定,只是 D 是否会让你从某些函数中调用它们。因此,您可以将 C 函数标记为 pure
和/或 nothrow
.但是如果你用 pure
标记它,你最好确保这个函数实际上是纯的。 (或者您可能会遇到讨厌的错误)- nothrow
也是如此.从技术上讲,@safe、@trusted 和 @system 也可以使用,但 C 函数确实应该保留为默认值 - @system - 因为它们是 C 函数。
不,将 C 函数的参数标记为 const
不太可能帮助任何优化。如果参数是值类型,那么 const
从调用者的角度来看是没有意义的。无论如何都会复制该参数。它只与引用类型有关。在 extern(C)
的情况下,这将仅限于带有指针的指针和结构(无论是直接还是间接)。那里可能有一些优化,但我不会打赌——尤其是使用 dmd,它通常不会像 gdc 和 ldc 那样优化代码。充其量,编译器可以做的是确定在该调用之后,传入的变量没有改变,这可能会在调用者中启用其他优化,但它高度依赖于调用者和编译器。
比较关心的是C参数是否真的是const
.一般来说,你很好,但在 C 中,丢弃 const
是合法的。并改变一个变量,而在 D 中,it's not . immutable
主要可能是一个问题。数据(字符串文字是一个典型的例子)。如果有任何东西试图实际改变数据,您将面临段错误或更糟的风险。一般来说,这不应该是标记为 const
的 C 函数参数的问题。 (尽管有时可能),但这绝对意味着将参数标记为 const
当 C 没有时几乎可以肯定是一个坏主意。如果你这样做,你需要确保变量的值永远不会被 C 函数实际改变。因为如果你把它标记为 const
然后 C 函数对其进行变异,您将遇到错误。
所以,总而言之,我想说的是,一般来说,你应该只标记 extern(C)
带有 C 修饰符的函数,而不是特定于 D 的修饰符,通常不应将参数标记为 const
除非它们在 C 中以这种方式标记。如果您知道 C 函数实际上是什么 pure
,可以标记为pure
.如果你知道它实际上是 nothrow
, 你可以用 nothrow
标记它.如果您知道 C 函数从未改变过参数,那么您可以将其标记为 const
.但是你应该对此非常保守,否则你会在你的代码中造成讨厌的错误。
如果您还没有阅读这些页面,请阅读:
http://dlang.org/interfaceToC.html
http://dlang.org/htomodule.html
关于c - d2 : Parameter storage class interoperability with functions implemented outside of D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049343/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!