簡體   English   中英

類成員訪問說明符和二進制代碼

[英]class member access specifiers and binary code

我理解典型的訪問說明符是什么,以及它們的含義。 “公共”會員可以在任何地方訪問,“私人”會員只能由同一個班級和朋友等訪問。

我想知道的是,如果有的話,這等同於較低級別的術語。 它們之間的任何后編譯功能差異超出了它們所使用的語言(在本例中為c ++)強加的高級限制(可以訪問什么)。

另一種說法 - 如果這是一個完美的世界,程序員總是做出好的選擇(比如不能訪問后來可能會改變的成員,並且只使用明確定義的成員,這些成員應該在實現之間保持不變),他們是否有理由使用這些事情呢?

訪問說明符僅用於編譯目的。 程序分配中的任何內存都可以被可執行文件的任何部分訪問; 在運行時沒有公共/私人概念

邁克爾的回答是正確的。 訪問說明符不會直接影響生成的代碼。

但是,訪問說明符可以解決模糊的標識符/重載錯誤,否則會阻止編譯。

class A {
private:
    int x;
};

class B {
protected:
    int x;
};

class C : public A, public B {
public:
    int &get_x() { return x; } // only B::x is accessible, no error.
};

所以他們肯定比限制程序員更有目的。

您的問題的答案可能因編譯器而異,但一般情況下沒有區別。 人們可以設想一個環境,對於那些不同的可訪問性,編譯的代碼可能具有不同的特征,但我不知道存在任何特征。

程序員只有擁有正確的信息才能做出正確的選擇。 訪問修飾符是一種向程序員發出信號的方式,即不應該觸及某些事物,並且它具有強制執行正確行為的附帶好處。

沒有運行時影響。 您可以使用正確的訪問修飾符編寫程序,使用c++ -Dprotected=public -Dprivate=public file.cc構建它,並且它應該構建並生成幾乎完全相同的代碼(有一些假設的警告,例如類的數據布局)。

在編譯后,您將得到機器代碼(程序集),它沒有“公共”或“私有”(或類,成員等)的概念。 一切都只是一個內存地址(無論是代碼還是數據),並且可以像任何其他內存地址一樣進行訪問。 整個公共\\私有區別(以及高級語言中幾乎所有其他構造)純粹是為了程序員的利益,允許編譯器強制執行一組旨在實現代碼意圖的規則更清楚,並幫助避免潛在的錯誤。 編譯完成后,您的代碼不知道最初編寫的語言,更不用說使用的訪問說明符類型了。

話雖這么說,有可能裝配一個編譯器,以便每當調用private類成員函數時它都會修改代碼,以便檢測函數被不適當地調用的時間(添加一個額外的參數並將其設置為某個預期值,當函數是從類中調用的;從類外部調用函數會提供錯誤的值)。 這種方法的問題是你現在做什么? 鎖起來? 什么都不做,並返回無效數據? 這些類型的問題在編譯時(相對)容易檢測和糾正,因此很少看到在運行時(調試或代碼分析工具之外)強制執行此類操作。

暫無
暫無

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

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