美文网首页
C++与Rust操作裸指针的比较

C++与Rust操作裸指针的比较

作者: 熊皮皮 | 来源:发表于2018-11-09 07:29 被阅读154次

文档列表见:Rust 移动端跨平台复杂图形渲染项目开发总结 - 目录

判断指针是否为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
    }
}

相关文章

  • C++与Rust操作裸指针的比较

    文档列表见:Rust 移动端跨平台复杂图形渲染项目开发总结 - 目录 判断指针是否为NULL/nullptr 假设...

  • C/C++转Rust的项目实践总结 1-5

    目录: 导入外部符号 C++与Rust数据类型对应关系 使用slice直接读写指针内容写指针读指针 判断指针是否为...

  • rust与c,c++,go,java性能比较

    一,rust与c 二,rust与c++ 三,rust与go 四,rust与java

  • Rust for cpp devs - 智能指针

    与 cpp 类似,Rust 也有智能指针。Rust 中的智能指针与引用最大的不同是,智能指针 own 内存,而引用...

  • rust 开篇

    1、rust 语言特点 Rust 基于C++,理论上来说,它的速度与 C / C++ 同级 Rust 被设计为保证...

  • Java基础

    Java和C++的区别?a. Java没有指针。c++可以通过指针直接操作内存,但这个动作是危险的,指针引起的操作...

  • rust中的智能指针Box

    rust中的指针大致可以分成三种:引用、裸指针和智能指针。 智能指针实际上是一种结构体,只不过它的行为类似指针。智...

  • 计算机基础的考察

    语言语法(以C/C++为例)。 指针(数组),函数指针,操作符运算顺序,const(常指针与指向常量指针),sta...

  • C++原生指针,引用与智能指针

    Ref 原生指针 c++原生指针来源于c语言,常与取地址运算符&搭配使用,基本操作有修改指针指向,解引用操作。常用...

  • Rust 编程语言-4-理解ownership

    4.1 理解ownership Rust的一个核心概念,通过所有权机制,解决了C/C++语言中的野指针,悬挂指针等...

网友评论

      本文标题:C++与Rust操作裸指针的比较

      本文链接:https://www.haomeiwen.com/subject/rlhnxqtx.html