gpt4 book ai didi

c - d2 : Parameter storage class interoperability with functions implemented outside of D

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:16 24 4
gpt4 key购买 nike

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 ,或者这将没有效果(至少对于值类型参数)?
refout
有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 ,或者它们只是看起来像的普通指针? D 会为初始化生成“胶水代码” out调用超出 D 范围时将参数设置为默认值?

更新1:我编写了简单的代码来测试 ref s 和 out s 在参数中处理——它们实际上似乎是至少对于 int 的普通指针s,但是 out传递时不会重置为初始值 - C 端仍然可以读取它的值并修改它,因此它的作用类似于 ref .我不确定,当我以这种方式使用东西时,是否会出现与 GC 相关的问题。

更新 2:使用 ref而不是函数结果中的指针也可以按预期方式工作。 const仍然未经测试,我不知道如何检查它而不需要反汇编我的程序。

最佳答案

in (与 const scope 相同)在 C 中不存在,因为 scope在 C 中不存在。而 outref在 C 中也不存在。不要将它们与 extern(C) 一起使用职能。如果您在 extern(C) 的参数中使用它们,编译器可能会报错。功能,但如果没有,我不会感到惊讶。如果它碰巧奏效了,那你就“幸运”了。它可能随时停止工作。如何refout实现的是编译器的实现细节。通常,您应该只在 extern(C) 上使用修饰符。 C 中实际存在的函数。D 的编译器不会做任何魔法来使 D 的东西在 extern(C) 上工作。功能。它预计 extern(C)函数成为具有 C 具有的功能的 C 函数,而不是 D。

我知道的唯一两个异常(exception)是 purenothrow ,因为它们根本不影响调用约定,只是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com