博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++与Rust操作裸指针的比较
阅读量:7229 次
发布时间:2019-06-29

本文共 2088 字,大约阅读时间需要 6 分钟。

文档列表见:

判断指针是否为NULL/nullptr

假设存在const T* ptr1T* ptr2,分别判断它们是否为空,C++和Rust实现如下所示。

if ((NULL == ptr1) || (nullptr == ptr2)) {  // do something}复制代码
use std::ptr;if ptr::null() == ptr1 || ptr::null_mut() == ptr2 {    // do something}复制代码

返回nullptr/NULL

由前面可知,Rust提供C接口时返回nullptr或NULL的实现如下

#[no_mangle]pub extern "C" fn init_engine() -> * const c_void {    // something goes wrong    std::ptr::null()}fn main() {    unsafe{        let engine = init_engine();        println!("{:?}", engine);    }}复制代码

使用slice直接读写指针内容

写指针

const int COUNT = 100;int *int_ptr = new int[COUNT];for (int i = 0; i < COUNT; ++i) {    int_ptr[i] = i;}复制代码

将上述C++申请的ptr指针传递到Rust进行写入,最差的办法是在Rust内部创建一个长度相同的Vector,将数据写入Vector,再通过std::ptr::copyint_ptr中,示例如下:

use std::ptr;#[no_mangle]pub extern "C" fn write_to_c_buffers(n: usize, buffers: *mut i32) {    let mut tmp_buffers = Vec::with_capacity(n);    for index in 0..n {        tmp_buffers.push(index);    }    unsafe {        ptr::copy(tmp_buffers.as_ptr(), buffers, n);    }}复制代码

上述的tmp_buffers分配了一块与buffers等长的新内存,这样多占用了内存,不科学。

使用std::slice直接读写裸指针可实现前面C++式的做法,示例如下:

use std::slice;#[no_mangle]pub extern "C" fn write_to_c_buffers(n: usize, buffers: *mut i32) {    unsafe {        let mut slice = slice::from_raw_parts_mut(buffers, n);        for index in 0..n {            slice[index] = index;         }    }}复制代码

进一步,可使用Rust类似C#的foreach进行循环,同时缩小unsafe代码块的影响空间。读指针也可用这个方案。

use std::slice;#[no_mangle]pub extern "C" fn write_to_c_buffers(n: usize, buffers: *mut i32) {  let mut buffers = unsafe { slice::from_raw_parts_mut(buffers, n) };  for slice in buffers {    *slice = //do something;   }  }复制代码

读指针

int summary(size_t count, int ptr*) {    int sum = 0;    for (int i = 0; i < count; ++i) {        sum += ptr[i];    }    return sum;}复制代码

ptr传递到Rust进行求和,用slice可以直接操作,避免分配额外的内存,示例如下:

use std::slice;#[no_mangle]pub extern "C" fn summary_for_c_buffers(n: usize, buffers: *const i32) {    unsafe {        let slice = slice::from_raw_parts(buffers, n);        let mut sum = 0;        for index in 0..n {            sum += slice[index];        }        sum    }}复制代码

转载地址:http://mrdfm.baihongyu.com/

你可能感兴趣的文章
强大的vim配置文件,让编程更随意
查看>>
崛起于Springboot2.X之配置文件详解(10)
查看>>
定时执行程序-Quartz简单实例
查看>>
【CF 应用开发大赛】MyfCMS系统
查看>>
windows下kangle虚拟主机-架设java空间的教程及心得
查看>>
Discuz! X2.5:文件目录结构
查看>>
我的友情链接
查看>>
TCP/IP协议及首部初了解
查看>>
防火墙iptables
查看>>
CUDA搭建
查看>>
memcached与PostgreSQL缓存命中机制
查看>>
百度地图路线检索(3)
查看>>
linux netstat 命令详解
查看>>
对前几篇blog的环境等的补充说明
查看>>
Curl命令使用解析大全
查看>>
MySQL日期函数
查看>>
【00】Effective Java
查看>>
.NET重构—单元测试重构
查看>>
SMB简介sabma服务(一)
查看>>
ANT简明教程
查看>>