首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CFFI、回调和 void *(如何在公共 lisp/cffi 中创建指向本机对象的指针?)

关于CFFI、回调和void *的问题,我们可以从以下几个方面进行解答:

  1. CFFI(Common Foreign Function Interface)

CFFI是一个用于在Common Lisp中调用外部C语言函数的库。它允许开发者在Lisp中定义C语言函数的签名,并通过生成的绑定来调用这些函数。CFFI可以自动处理参数和返回值的类型转换,使得在Lisp中调用C语言函数变得简单。

  1. 回调(Callback)

回调是一种函数调用模式,它允许一个程序在特定的事件或条件下调用另一个程序中的函数。在CFFI中,回调通常用于在Lisp中实现C语言的回调函数。当C语言库需要在特定事件发生时调用Lisp函数时,可以使用回调来实现。

  1. void *

void 是C语言中的一种特殊指针类型,它可以指向任意类型的数据。在CFFI中,void 通常用于表示指向未知类型的本地C语言对象的指针。在Lisp中,可以使用CFFI:FOREIGN-POINTER来表示void *类型的指针。

如何在公共lisp/cffi中创建指向本机对象的指针?

在CFFI中,可以使用以下方式创建指向本地C语言对象的指针:

代码语言:txt
复制
(cffi:foreign-alloc :pointer)

这将分配一个void *类型的指针,可以用于指向任意类型的本地C语言对象。使用完毕后,需要使用cffi:foreign-free释放指针以避免内存泄漏。

总结:CFFI、回调和void *是在Lisp中调用C语言函数和操作本地对象时常用的概念。通过使用CFFI库,可以在Lisp中方便地调用C语言函数和创建指向本地对象的指针。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rust FFI 编程 - 其它语言调用 Rust 代码 - Python

对于每种语言,如果将 Rust 库的公共接口转换为应用程序二进制接口( C ABI),则在其它编程语言中可以相对容易地使用它们,当前列表中的语言都具有某种形式的外部函数接口(C FFI),剩下的就是其它语言和...字符串则比较复杂,Rust 中的字符串,是一组 u8 组成的 UTF-8 编码的字节序列,字符串内部允许 NUL 字节;但在 C 中,字符串只是指向一个 char 的指针,用一个 NUL 字节作为终止。...同时在 Rust 中有切片的概念,它包含一个指针和一组元素的数据。 在 Rust FFI 中使用 from_raw_parts 将指针和长度,转换为一个 Rust 中的切片。...并没有明显的 C 数组对等物,它们在 CFFI 中对应于的 cdata 类型。...可以通过 ffi.new(cdecl,init=None) ,根据指定的 C 类型分配实例,并返回指向它的指针。

2.3K40
  • Python开发者必备6个基本库

    而其他一些应用,如PBR、CFfI和MyPy,对于开发所有类型的Python应用程序都很有用。 项目一: PyPy 什么是PyPy?...为了解决这个问题,PyPy 5.9对CFFI库(见下文)和PyPy的Python C API兼容层进行了改进。 此外,在5.9版本中,PyPy的JSON解析器在处理多种JSON对象时明显更快。...CFFI 1.11 下载地址 CFFI可以从Python包索引中独立下载,也可以使用Python的pip工具安装:pip install cffi。 BitBucket上提供源代码和错误跟踪。...PyInstaller 3.3特点 PyInstaller将Python应用程序打包为单个目录或单个文件可执行文件中,将需要的第三方库与其一起打包,并与绝大多数公共库和框架配合使用。...它还为仅用于包含特定类型的对象的目录添加“TypedDict”类型,并且可以逐个对文件进行更严格的类型检查。

    1.5K10

    使用 C 或 C++ 扩展 Python

    举个例子,如果你的用例调用了C库或系统调用,你应该考虑使用 ctypes 模块或 cffi 库,而不是自己写C代码。这些模块允许你写Python代码来接口C代码,而且可移植性更好。...对模块级函数, self 参数指向模块对象;对于对象实例则指向方法。 args 参数是指向一个 Python 的 tuple 对象的指针,其中包含参数。每个 tuple 项对应一个调用参数。...PyArg_ParseTuple(args, "s", &command)) return NULL; 如果在参数列表中检测到错误,将会返回 NULL (返回对象指针的函数的错误指示器) ,...这是一个指针赋值,你不应该修改它所指向的字符串 (所以在标准 C 中,变量 command 应当被正确地声明为 const char *command)。...这是一个真正的PY对象,而不是 NULL 指针。 5、 模块方法表 为了展示 great_function() 如何被Python程序调用。

    1.2K22

    CMake 秘籍(五)

    该项目托管在一个公共 Git 仓库中,我们使用GIT_TAG选项来指定下载哪个分支。...(如可执行文件)的对象文件的档案 SHARED,用于创建共享库;即,可以在运行时动态链接和加载的库 OBJECT,用于创建对象库;即,不将对象文件归档到静态库中,也不将它们链接成共享对象...在这种情况下,我们不必显式声明构造函数和析构函数——这些会为我们自动创建,并在 Python 对象创建时自动调用: myaccount = Account() 当对象超出作用域并被 Python 垃圾回收机制收集时...与前一个示例相比,我们将展示如何在配置时获取 pybind11 依赖项,并使用我们在第四章,创建和运行测试,示例 3,定义单元测试并与 Google Test 链接中遇到的 FetchContent 方法构建我们的项目...实现文件(cpp_implementation.cpp)与之前的菜谱类似,但包含了额外的assert语句,因为我们将在一个不透明的句柄中保持对象的状态,并且我们必须确保在尝试访问它之前创建了对象: #include

    73120

    掌握C++回调:按值捕获、按引用捕获与弱引用

    这在处理回调和长时间运行的任务时非常有用,因为它可以避免因为回调导致的潜在内存泄漏。...然而,如果新线程开始执行时,this指针所指向的对象已经被销毁,这将导致未定义的行为。...这样,即使原始对象被销毁,新线程中也不会访问到无效的this指针。...这样,在回调执行时,如果this指针所指向的对象已经被销毁,回调将不会执行,从而避免了潜在的内存泄漏问题。 下面是执行CGI任务时的回调写法。...弱引用 弱引用是一种特殊的引用类型,它不会阻止其所引用的对象被垃圾回收。这在处理回调和长时间运行的任务时非常有用,因为它可以避免因为回调导致的潜在内存泄漏。

    24510

    帮你提升 Python 的 27 种编程语言

    我尽可能地把链接指向维基百科页面,而不是直接指向相关内容的主页面,因为维基百科往往提供一些有趣的历史背景,若是作为学习实践而不是立即进行实际应用时,花时间探索一番背后的历史是值得的。...,从而结构性地避免了许多C语言的常见缺陷(诸如缓存区溢出,重复释放指针错误,空指针获取和线程同步问题)。...来存放数据,而后把struct的实例作为函数的第一个参数传入并处理该数据(这些就是CPython的C语言API中无处不在的PyObject*指针)。...Clojure 是另一款JVM上的函数式编程语言,它算是 Lisp 的一种变种。它能够在此列表中赢得一席之地归因于它是Python的 toolz 函数式编程工具箱的灵感来源。...当我们谈论通过具体实例计算(如机器人)的教学时,我赞同面向对象编程的人所持的观点,因为软件中建模的对象在实际生活中有学生们能感触到的对应模块,如传感器、电机和继电器。

    96650

    帮你提升 Python 的 27 种编程语言

    我尽可能地把链接指向维基百科页面,而不是直接指向相关内容的主页面,因为维基百科往往提供一些有趣的历史背景,若是作为学习实践而不是立即进行实际应用时,花时间探索一番背后的历史是值得的。...,从而结构性地避免了许多C语言的常见缺陷(诸如缓存区溢出,重复释放指针错误,空指针获取和线程同步问题)。...来存放数据,而后把struct的实例作为函数的第一个参数传入并处理该数据(这些就是CPython的C语言API中无处不在的PyObject*指针)。...Clojure 是另一款JVM上的函数式编程语言,它算是 Lisp 的一种变种。它能够在此列表中赢得一席之地归因于它是Python的 toolz 函数式编程工具箱的灵感来源。...当我们谈论通过具体实例计算(如机器人)的教学时,我赞同面向对象编程的人所持的观点,因为软件中建模的对象在实际生活中有学生们能感触到的对应模块,如传感器、电机和继电器。

    94080

    C#垃圾回收机制(GC)

    出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。...主要处理步骤:将线程挂起=>确定roots=>创建reachable objectsgraph=>对象回收=>heap压缩=>指针修复 可以这样理解roots:heap中对象的引用关系错综复杂...当程序中使用了new操作符在Managed Heap上分配空间时,GC会对其进行分析,如果该对象含有Finalize方法则在Finalization Queue中添加一个指向该对象的指针。...再在垃圾中搜索,如果发现垃圾中有被Finalization Queue中的指针所指向的对象,则将这个对象从垃圾中分离出来,并将指向它的指针移动到Freachable Queue中。...ReRegisterForFinalize方法其实就是将指向对象的指针重新添加到Finalization Queue中。

    80510

    CLR和.Net对象生存周期

    这里还涉及到一个重要的指针,Jeffrey将称为NextObjPtr,由CLR进行维护,该指针指向下一个对象在堆中的分配位置。...对于托管堆而言,分配一个对象只是修改NextObjPtr指针的指向,这个速度是非常快的。事实上,在托管堆上分配一个对象和在线程栈上分配内存的速度很接近。...CLR要求所有对象(主要指引用类型)都用new操作符创建,new操作符在完成四步操作以后,会返回指向托管堆上新建对象的一个引用(或指针,视情况而定),在使用完以后,C#并没有如C++对应的delete操作符来删除对象...Tips:所有的全局和静态对象指针是应用程序的根对象,另外在线程栈上的局部变量/参数也是应用程序的根对象,还有CPU寄存器中的指向托管堆的对象也是根对象。...假如第 1 代对象在某个时间段增长到超过预算的阶段,那么CLR将在下一次进行GC回收时,检查第 1 代对象,然后统一回收第 0 代和第 1 代中的垃圾对象。

    1.2K50

    浅谈C++回调函数的实现

    所以,C++回调函数也并非高大上的技术,它的原理无非就是函数指针或者对象的传递。本文就从函数指针开始对回调函数进行说明。...1 函数指针 函数指针是指一个变量,函数对象创建后就会分配一个地址,这个地址可以通过变量进行保存。这个变量就叫做函数地址变量,也可以称之为函数指针。...函数指针的定义方式如下: int(*p)(int, int); 如上,定义了一个函数指针,它指向一个包含两个整型参数且返回值为整型数值的函数对象。...,里面定义了一个纯虚的公共接口,其它类都继承自基类,在使用时就可以将这个类指针传递给回调函数,进而实现回调的功能。...回调可用于网络编程中,如通过回调函数获取服务端返回的数据信息并进行处理。 - EOF - 图文:龙小 排版:龙小

    2.1K10

    CLR和.Net对象生存周期

    这里还涉及到一个重要的指针,Jeffrey将称为NextObjPtr,由CLR进行维护,该指针指向下一个对象在堆中的分配位置。...对于托管堆而言,分配一个对象只是修改NextObjPtr指针的指向,这个速度是非常快的。事实上,在托管堆上分配一个对象和在线程栈上分配内存的速度很接近。...CLR要求所有对象(主要指引用类型)都用new操作符创建,new操作符在完成四步操作以后,会返回指向托管堆上新建对象的一个引用(或指针,视情况而定),在使用完以后,C#并没有如C++对应的delete操作符来删除对象...Tips:所有的全局和静态对象指针是应用程序的根对象,另外在线程栈上的局部变量/参数也是应用程序的根对象,还有CPU寄存器中的指向托管堆的对象也是根对象。...假如第 1 代对象在某个时间段增长到超过预算的阶段,那么CLR将在下一次进行GC回收时,检查第 1 代对象,然后统一回收第 0 代和第 1 代中的垃圾对象。

    82760

    在 C# 中使用 Span 和 Memory 编写高性能代码

    开发者可以使用不安全的代码块和指针直接操作内存,但是这种方法有相当大的风险,指针操作容易出现错误,如溢出、空指针访问、缓冲区溢出和悬空指针。...若要创建空的 Span,可以使用 Span.Empty 属性: Span span = Span.Empty; 下面的代码片段演示如何在托管内存中创建 Byte 数组,然后从中创建...var array = new byte[100]; var span = new Span(array); C# 中的 Span 下面是如何在堆栈中分配一块内存并使用 Span 指向它:...这在使用本机库或与其他语言进行互操作时特别有用; 它们允许开发者在性能至关重要的紧密循环(如加密或网络包检查)中消除边界检查; 它们允许开发者消除与通用集合(如 List)相关的装箱和取消装箱成本; 通过使用单一数据类型...非连续缓冲区(如 ReadOnlySequence (与段一起使用时))驻留在内存的单独区域中,这些区域可能分散在堆中,不能被单个指针访问。

    3.1K10
    领券