- 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/
目前,我以“正常”方式实现所有 Web 服务...也就是说,我在 Eclipse 中创建一个 WSDL 文件,然后使用 WSCF.blue(一个 Visual Studio 扩展)自动生成必要的代码,
为什么这不起作用?在 Java 代码中: import scala.collections.immutable.Range; // ... Range r = Range.apply(0, 10) E
我一如既往地感谢您在我的旅程中为我提供的时间和精力:) 因此,作为一个 Nerd ,我已经开始深入了解操作系统的工作原理。我有一个问题是关于内核和标准库,例如 Linux 的 glibc,它充当函数包
我基本理解托管代码和 native 代码的概念及其 difference .但是他们之间如何在技术上进行交流呢?想象一下以下示例: 我得到了一些为特定平台编译的静态或动态 C++ 库。现在我写了一个
是否可以使用 Terraform 启用对 GCS 的 s3 兼容访问并生成/检索 key 对? 帮助说明: The Interoperability API lets you use HMAC aut
const (和 in ) 考虑有 C 函数: unsigned int foo(const unsigned int a); const对生成的代码没有影响,就像代码通过 const 的编译一样,如
我在 Spring Data Mongodb 中使用 QueryDSL 谓词。但是,我面临着必须将 Query API 与 MongoTemplate 一起使用的情况(例如,过滤要从 Mongo 获取
如果可能,我只想支持一种 Beacon 标准,让设备本身充当“主机/信标”,而其他设备充当“监听器”。 我支持使用 Xamarin 的 Android、iOS 和可能的 Windows 手机。 iOS
一些工具(例如 fog library )需要使用 Interoperability API能够管理 Google Cloud Storage 存储分区中的对象。该 API 使用 HMAC 身份验证。
我是一名优秀的程序员,十分优秀!