文件列表見:rust 移動端跨平台複雜圖形渲染專案開發系列總結(目錄)
假設存在const t* ptr1
和t* 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::copy
到int_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它自己。...