二進位制相容問題

2021-07-16 18:46:46 字數 1116 閱讀 8333

二進位制相容問題,主要是針對動態鏈結庫而言的。在windows上就是dll,在linux上就是so。 如果主程式exe(當然也可以是客戶庫)不變,公升級了依賴庫so1到so2,而不需要重新編譯,那麼就是說so2是相容so1庫的。二進位制相容涉及到編譯問題,所以和硬體平台,軟體平台以及編譯器等都是密切相關的。主要是語言編譯後的資料在記憶體中的結構問題。所以很大程度上和語言相關。比如c++語言由於涉及到很多高階特性(虛函式,模板,內聯函式,函式過載,name mangling),導致要編寫二進位制相容的庫有很多限制。

我們舉個例子,在c++語言裡對struct和class的資料成員的訪問是通過偏移量來獲取的,所以你在乙個類中間插入乙個成員變數,就會導致後面的變數偏移量發生變化,那麼肯定是非二進位制相容的,但是你改變乙個變數的名稱卻可以(但是這樣做卻是源**不相容的,呵呵)。

如果你改變了乙個類bar的大小,那麼這樣是不是二進位制相容的呢?

增加新的class: 是

在類裡增加非虛函式:是

在類裡面增加列舉:是

在列舉裡追加乙個值(在最後加):是

去掉類裡乙個private的非虛函式,並且這個函式沒有被inline函式呼叫過:是

去掉類裡乙個private的靜態變數,並且這個變數沒有被inline函式使用過:是

增加乙個靜態變數:是

匯出乙個之前沒有匯出過的類:是

增加或去掉類的友元宣告:是

給reserved變數改名:是

擴充套件reserved的bit位:是

對匯出類remove或者去掉匯出:否

改變類的繼承關係:否

改變模板引數(增加,取出,改變順序):否

extern "c" 有兩重含義:

1.這是一段c++**,但是沒有太多高階特性,我希望用c語言的習慣來編譯;

2.我希望對這段c++**用c語言的方式來呼叫(或者鏈結)。

其實動態鏈結技術(dll和so)主要是用在c語言上的,是以匯出函式為基礎的。如果用在c++上,相容性確實很成問題,在匯出類,成員函式時需要各種其他手段,而且沒有完美解決方案。 windows的庫函式就是使用c語言加dll來實現的。

對於c語言,c/posix 這些年逐漸加入了很多新函式,同時,現有的**不用修改也能執行得很好。如果要用這些新函式,直接用就行了,也基本不會修改已有的**。

二進位制問題

題目 題解 純二進位制題目。因為所有的水都是由兩份相同的水合併而成的,因此每瓶水的體積一定是2 i,i in n 2 i i n 公升。最後保留k個瓶子,那麼最後總的公升數的二進位制表示中,1的個數一定 k。本題實質上是用不超過k個1和無數個0生成乙個最接近且大於n的二進位制數 方法一 includ...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

c 二進位制相容本質

總的一條就是讓client只依賴 名字 而不依賴任何 實現 實現 具體的就是2類 1 函式體,code 2 任何記憶體塊大小,layout細節 為什麼會有二進位制相容問題,就是因為一般的c 標頭檔案並不是單純的介面宣告,其中也還包括了 實現細節 因為成員變數就是一種記憶體layout,就屬於實現細節...