C 與Rust操作裸指標的比較

2021-09-11 09:02:53 字數 1970 閱讀 5641

文件列表見:rust 移動端跨平台複雜圖形渲染專案開發系列總結(目錄)

假設存在const t* ptr1t* ptr2,分別判斷它們是否為空,c++和rust實現如下所示。

if ((null == ptr1) || (nullptr == ptr2)) 

複製**

use std::ptr;

if ptr::null() == ptr1 || ptr::null_mut() == ptr2

複製**

由前面可知,rust提供c介面時返回nullptr或null的實現如下

#[no_mangle]

pubextern

"c"fn

init_engine

() -> * const c_void

fnmain

() ", engine);

}}複製**

const

int count = 100;

int *int_ptr = new

int[count];

for (int i = 0; i < count; ++i)

複製**

將上述c++申請的ptr指標傳遞到rust進行寫入,最差的辦法是在rust內部建立乙個長度相同的vector,將資料寫入vector,再通過std::ptr::copyint_ptr中,示例如下:

use std::ptr;

#[no_mangle]

pubextern

"c"fn

write_to_c_buffers

(n: usize, buffers: *mut

i32)

unsafe

}複製**

上述的tmp_buffers分配了一塊與buffers等長的新記憶體,這樣多占用了記憶體,不科學。

使用std::slice直接讀寫裸指標可實現前面c++式的做法,示例如下:

use std::slice;

#[no_mangle]

pubextern

"c"fn

write_to_c_buffers

(n: usize, buffers: *mut

i32)

}}複製**

進一步,可使用rust類似c#的foreach進行迴圈,同時縮小unsafe**塊的影響空間。讀指標也可用這個方案。

use std::slice;

#[no_mangle]

pubextern

"c"fn

write_to_c_buffers

(n: usize, buffers: *mut

i32) ;

for slice in buffers

}複製**

int

summary

(size_t count, int ptr*)

return sum;

}複製**

ptr傳遞到rust進行求和,用slice可以直接操作,避免分配額外的記憶體,示例如下:

use std::slice;

#[no_mangle]

pubextern

"c"fn

summary_for_c_buffers

(n: usize, buffers: *const

i32)

sum}

}複製**

C 引用與指標的比較

c 語言中,函式的引數和返回值的傳遞方式有三種 值傳遞 指標傳遞和引用傳遞。引用與指標的比較 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能有null引用,引用必須與合法的儲存單元關聯 指標則可以是null 3 一旦引用被初始化,就不能改變引用的關係 指標則可以隨時改變所指...

C 引用與指標的比較

c 引用與指標的比較 c 語言中,函式的引數和返回值的傳遞方式有三種 值傳遞 指標傳遞和引用傳遞。引用與指標的比較 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能有null引用,引用必須與合法的儲存單元關聯 指標則可以是null 3 一旦引用被初始化,就不能改變引用的關係 ...

C 引用與指標的比較

c 引用與指標的比較 引用是c 中的概念,初學者容易把引用和指標混淆一起。一下程式中,n是m的乙個引用 reference m是被引用物 referent int m int n m n相當於m的別名 綽號 對n的任何操作就是對m的操作。所以n既不是m的拷貝,也不是指向m的指標,其實n就是m它自己。...