簡體   English   中英

簡單的圖書館問題(C ++)

[英]Simple Library Questions (C++)

1. 共享庫和動態庫是否完全相同?
windows只是將它們標記為.dll ,linux將它們標記為.so

2.如果共享庫具有程序使用的大量函數,那么這些函數何時加載到內存中?
在計划開始時? 什么時候實際調用特定的函數?

3.如果我創建這樣的庫:

#ifndef SHARED_H
#define SHARED_H

#include <iostream>
#include <string>

namespace shared
{
  void Function1(void);
  void Function2(void);
  void Function3(void);
  void Function4(void);
  void Function5(void);
  void Function6(void);
  ...
  void Function99(void);
  void Function100(void);
  ...
}
//assume none of these functions call each other

#endif

並且我的客戶端程序只調用其中一個函數,由於未使用的所有其他額外函數,它們的性能會降低嗎?
不擔心編譯時間..只是實際的運行時間

4.如果我使用課程,問題3的情況會有所不同:

#ifndef SHARED_H
#define SHARED_H

#include <iostream>
#include <string>

class Shared
{
  public:
  void Function1(void);
  void Function2(void);
  void Function3(void);
  void Function4(void);
  void Function5(void);
  void Function6(void);
  ...
  void Function99(void);
  void Function100(void);
  ...
  private:
  protected:
};
//assume none of these functions call each other

#endif

5.我使用,以使大量的對象(.o文件),然后將它們連接在一起,使我的可執行文件。 將所有對象(通常是類)轉換為.so文件然后將它們鏈接在一起會更好嗎?
我知道可執行文件將依賴於.so文件,不像第一種方法可以在編譯后刪除對象,但對此有何推薦?

6.關於-fPIC和-fpic之間的區別,我有點不知所措
我聽說-fPIC將始終有效,-fpic依賴於目標。
目標依賴意味着什么? 如果庫總是要在同一台機器上編譯和使用,我可以安全地使用-fpic嗎?

其中一些問題可能是微不足道的,但我想確定我到目前為止所閱讀的內容。 我感謝任何和所有的回應
*如果相關:使用gcc版本4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)

對於第一和第二個問題:在Windows Xp線程中有dll(動態鏈接庫)作為組件。作為一個線程可以被視為輕量級進程。 一個過程只不過是執行中的程序。(運行時)。我猜dll和.so是相似的(可能存在變化,不確定)

外部庫通常以兩種形式提供:靜態庫和共享庫。 靜態庫是'.a'文件。 當程序鏈接到靜態庫時,程序使用的任何外部函數的目標文件中的機器代碼將從庫中復制到最終的可執行文件中。

鏈接到共享庫的可執行文件僅包含它所需的函數的小表,而不是來自外部函數的目標文件的完整機器代碼。 在可執行文件開始運行之前,外部函數的機器代碼由操作系統從磁盤上的共享庫文件復制到內存中 - 這個過程稱為動態鏈接。動態鏈接使可執行文件更小並節省磁盤空間,因為可以在多個程序之間共享庫的一個副本。

對於第三個問題:因為在共享庫中只有函數表被加載而不是代碼的實際助記符所以我們保存數據不像靜態庫,其中助記符是在編譯時加載的。這可以從上面的解釋中推斷出來。

對於第5個問題:我認為只有當你知道你很少去那些函數時才會把它們變成'.so'更好。如果你打算經常使用這些函數,那么把那些包含lib的函數作為static.As在運行時獲取它們會增加響應時間。

  1. 在Win下, dll's是動態鏈接庫,這意味着它們在運行時被單獨加載到內存中,這與編譯期間嵌入模塊中的靜態鏈接庫( lib's )不同。

  2. 在Win下,程序開始之前。 如果找不到它需要的dll,它將報告錯誤消息並退出。 除非你通過LoadLibraryGetProcAddress動態嘗試調用函數而不實際鏈接到庫,否則這是不可能的。

  3. 不可以。加載庫時,函數在內存中有一個眾所周知的位置。 無論函數有多少,每個函數調用只有一個jmpcall指令。

  4. 也沒有。 很可能這些函數將表示為非成員函數,將this作為額外參數。

  5. 主要原因是可重用性。 如果您有一個包含多個目標文件的功能獨立模塊,您也可以將它們組合在一起。 這樣您就可以更輕松地重復使用它,因為您只鏈接到一個庫而不是多個目標文件。

  6. ???

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM