Di balik layar publik, pribadi, dan dilindungi

Dec 08 2020

Saya mencoba untuk menyelami lebih dalam dan memahami perbedaan antara Public | Pribadi | Dilindungi dalam perspektif level rendah, di C ++.

Bagaimana perbedaan antara ketiganya yang diekspresikan dalam memori?

Jawaban

5 largest_prime_is_463035818 Dec 08 2020 at 20:48

private, publicdan protectedtidak menyebabkan anggota disimpan di wilayah memori tertentu. Akses diperiksa oleh kompilator. Pada level paling bawah, tidak ada perbedaan.

Namun, penentu akses memiliki efek pada jaminan apa yang Anda peroleh pada urutan di mana anggota kelas diletakkan di memori.

Dari draf standar C ++ 17 :

Anggota data nonstatic dari kelas (non-union) dengan kontrol akses yang sama (Klausul [class.access]) dialokasikan sehingga anggota selanjutnya memiliki alamat yang lebih tinggi dalam objek kelas. Urutan alokasi anggota data non-statis dengan kontrol akses berbeda tidak ditentukan (Klausul [class.access]). Persyaratan penyelarasan implementasi dapat menyebabkan dua anggota yang berdekatan tidak dialokasikan segera setelah satu sama lain; jadi mungkin persyaratan ruang untuk mengelola fungsi virtual ([class.virtual]) dan kelas basis virtual ([class.mi]).

Artinya, itu untuk

 struct foo {
     private:
        int x;
     protected:
        int a;
        int b;
     public:
        int m;
        int n;
     private:
        int y;
};

Anda hanya mendapat jaminan bahwa ingatan xdatang sebelum y, adatang sebelum bdan mdatang sebelum n. Selain itu, urutan penataan anggota dalam memori tidak ditentukan.

Namun, jarang sekali urutan anggota dalam ingatan merupakan informasi yang berguna. Oleh karena itu, tidaklah salah untuk mengatakan bahwa penentu akses tidak ada hubungannya dengan "memori level rendah".

2 SergeBallesta Dec 08 2020 at 20:44

Pada level terendah (representasi byte dari objek) sama sekali tidak ada perbedaan antara publik, privat dan dilindungi. Paling banyak penyusun dapat (tetapi tidak diharuskan untuk) menyusun ulang anggota sesuai dengan visibilitas mereka.

Pada tingkat perantara (perilaku waktu berjalan) ada sedikit perbedaan, jika ada. Jika Anda dapat menemukan penunjuk publik ke data pribadi, Anda dapat menggunakannya dengan aman. Secara khusus hal ini berbeda dari constness di mana menggunakan pointer non-const untuk mengubah data const adalah Perilaku yang tidak ditentukan secara eksplisit dan dapat menyebabkan kesalahan SIGSEGV.

Perbedaannya hanya pada level tertinggi. Anda dapat menggunakan anggota publik dari mana saja, sementara anggota pribadi hanya dapat digunakan di kelas di mana mereka dideklarasikan dan anggota yang dilindungi dapat digunakan dari kelas mereka dan semua kelas yang mewarisinya - tetapi persahabatan dapat memungkinkan kelas fungsi tertentu untuk mengakses pribadi atau dilindungi. data.

Yunnosch Dec 08 2020 at 20:35

Tidak semuanya.

Akses tersebut "diberikan / ditolak" oleh kompilator.

Akses apa pun yang tidak cocok dengan visibilitas yang sesuai (seperti yang dikontrol oleh kelas objek yang diakses, melalui penunjuk atau tidak) dicegah sebelum membangun.

catatan:

Jawaban lain berguna untuk membahas pengaruh visibilitas terhadap keteraturan dalam memori.

Saya howevr menjawab pertanyaan berbeda yang saya baca di posting OPs "Bagaimana fitur perlindungan memori digunakan untuk mengimplementasikan aksesibilitas / visibilitas anggota?", Yang menyangkut sebab dan akibat adalah jenis pertanyaan sebaliknya. Atau hanya pengurutan / penataan anggota dalam memori yang dikonfigurasi secara berbeda adalah alat untuk mencapai efek visibilitas yang diinginkan, yang pada gilirannya akan memerlukan (tetapi tidak menyebabkan) anggota untuk diurutkan dengan cara tertentu.

Yaitu saya tidak melihat konflik antar jawaban, hanya interpretasi pertanyaan yang berbeda.