中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

移植c到d07的方法有哪些

發布時間:2021-10-13 11:38:39 來源:億速云 閱讀:114 作者:iii 欄目:編程語言

本篇內容主要講解“移植c到d07的方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“移植c到d07的方法有哪些”吧!

操作系統用GetProcAddress/dlsym返回空*指針,一種是.

fooPtr = cast(fooPtr)getPtr();//變量,用作類型.

然后這樣:

alias int function() da_fooPtr;
da_fooPtr fooPtr = cast(da_fooPtr)getPtr();

所以,用別名要好點.da_表示d別名.還可以:

int foo() 
{
return 1;
}

void* getPtr()
{
return cast(void*) &foo;
}

void bindFunc(void** func)
{
*func = getPtr();
}

void main()
{
int function() fooPtr;
bindFunc(cast(void**)&fooPtr);
}//將foo**轉為(空**)

第2種,消除了別名.dmd以前未提供棧跟蹤.但dmd在編譯2進制時,不論是共享庫/exe,配置文件都預先配置為導出所有符號.否則,無法實現跟蹤棧.但卻使我的函數指針與導出庫的函數指針沖突了.即使是手動加載的共享庫.因而只好用回別名方式.不會導出別名函數指針/變量.如果你制作動態綁定,一定要注意這點.我仍然用空**來加載函數指針,因為它更簡單.

foo = cast(da_Foo)getSymbol("foo");
//你看不到
//你看到了
foo = bindFunc(cast(void**)&foo, "foo");

手動搞,后者復制粘貼更快.還有一點.給定一個動態綁定函數指針,要遵守d的存儲變量規則.d變量,默認為線程本地的,即每個線程有份變量拷貝.

如果在一個線程加載,而在另一個線程中調用,會崩潰的.

幸好,d的函數指針默認初化為null,解決方式是跨線程共享,用shared/__gshared.d的一個目標就是使并行更容易.通過共享,可以跨線程共用.編譯器會說,這不是線程安全訪問方式,與不變,常一樣,共享也是傳遞性的,你引用一個共享變量,這個引用也是共享的了.用__gshared時,就是全局變量,由程序員負責同步.因此,實現動態綁定時,要決定用線本?共享?全局共享?.

一般用__gshared,因為線程都要訪問.這時,要確保其自身生命期比訪問者更長,因而一般在靜態模塊構造器和析構器中加載/卸載他們.

extern( C )
{
alias void function(int) da_foo;
alias int function() da_bar;
}

__gshared
{
da_foo foo;
da_bar bar;
}

如何加載庫.我在DerelictUtil中實現了抽象了加載庫并取符號.外部我用自由函數來加載.

綁定要付出努力,動態綁定更累,其他人喜歡靜態綁定,但解析c是個難題.我更喜歡動態綁定.

到此,相信大家對“移植c到d07的方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

紫金县| 贡觉县| 阿克陶县| 招远市| 靖宇县| 叶城县| 罗甸县| 固阳县| 蓝田县| 乾安县| 广东省| 仁布县| 武清区| 全州县| 临夏县| 观塘区| 土默特左旗| 宿松县| 博爱县| 平乐县| 保康县| 防城港市| 会理县| 志丹县| 云安县| 保靖县| 沙洋县| 晋江市| 大安市| 兴和县| 图木舒克市| 山西省| 荔浦县| 临猗县| 即墨市| 汉中市| 土默特右旗| 甘孜县| 台湾省| 和龙市| 平南县|