Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah C menyusun objek dalam ingatan, dan apakah maksudnya untuk pemutus dinamik dan tafsiran semula?

Bagaimanakah C menyusun objek dalam ingatan, dan apakah maksudnya untuk pemutus dinamik dan tafsiran semula?

DDD
DDDasal
2024-11-02 03:52:30360semak imbas

How does C   arrange objects in memory, and what does it mean for dynamic casting and reinterpreting?

Susun atur memori objek C

Soalan:

Bagaimana C disusun dalam ingatan? objek? Saya mendengar bahawa pelakon dinamik hanya melaraskan penunjuk objek dalam ingatan, dengan mengimbangi manakala pentafsiran semula membolehkan kami melakukan sebarang operasi pada penunjuk ini. Saya tidak berapa faham. Sila berikan butiran!

Jawapan:

Susun atur memori

Susun atur memori bergantung terutamanya pada pelaksanaan. Terdapat satu pengecualian utama, iaitu pembolehubah ahli dengan penentu akses yang sama akan disusun dalam susunan pengisytiharan.

§ 9.2.14

非静态数据成员(非联合)具有相同访问控制权的类(Clause 11)被分配,以便后续成员在类对象中具有更高的地址。具有不同访问控制权的非静态数据成员的分配顺序未指定(11)。实现对齐要求可能导致两个相邻成员不会立即相互分配;管理虚拟函数(10.3)和虚拟基类(10.1)的空间要求也可能导致这种情况。

Pengurusan memori lain

Selain pembolehubah ahli, kelas atau struktur juga perlu mengurus pembolehubah ahli, sub-objek kelas asas, maya fungsi (seperti jadual maya) dan ruang yang disediakan untuk padding dan penjajaran data ini. Ia bergantung pada pelaksanaan, tetapi spesifikasi Itanium ABI adalah pilihan yang popular. gcc dan clang mengikutinya (sekurang-kurangnya pada tahap tertentu).

http://mentorembedded.github.io/cxx-abi/abi.html#layout

Itanium ABI

Sudah tentu, Itanium ABI bukan sebahagian daripada standard C dan tidak mengikat. Untuk mendapatkan maklumat yang lebih terperinci, anda perlu merujuk dokumentasi dan alatan pelaksana. clang menyediakan alat untuk melihat susun atur memori kelas. Contohnya, yang berikut:

class VBase {
    virtual void corge();
    int j;
};

class SBase1 {
    virtual void grault();
    int k;
};

class SBase2 {
    virtual void grault();
    int k;
};

class SBase3 {
    void grault();
    int k;
};

class Class : public SBase1, SBase2, SBase3, virtual VBase {
public:
    void bar();
    virtual void baz();
    // 不允许虚拟成员函数模板,原因考虑内存布局和虚表
    // template<typename T>
    // virtual void quux();
private:
    int i;
    char c;
public:
    float f;
private:
    double d;
public:
    short s;
};

class Derived : public Class {
    virtual void qux();
};

int main() {
    return sizeof(Derived);
}

Selepas mencipta fail sumber yang menggunakan susun atur memori kelas, denting akan memaparkan susun atur memori.

$ clang -cc1 -fdump-record-layouts layout.cpp

Susun atur Kelas:

*** Dumping AST Record Layout
   0 | class Class
   0 |   class SBase1 (primary base)
   0 |     (SBase1 vtable pointer)
   8 |     int k
  16 |   class SBase2 (base)
  16 |     (SBase2 vtable pointer)
  24 |     int k
  28 |   class SBase3 (base)
  28 |     int k
  32 |   int i
  36 |   char c
  40 |   float f
  48 |   double d
  56 |   short s
  64 |   class VBase (virtual base)
  64 |     (VBase vtable pointer)
  72 |     int j
     | [sizeof=80, dsize=76, align=8
     |  nvsize=58, nvalign=8]

Lagi maklumat susun atur memori

Lagi tentang denting ini Maklumat tentang ciri ini boleh didapati di blog Eli Bendersky:

http://eli.thegreenplace.net/2012/12/17/dumping-a-c-objects-memory-layout-with-clang/

gcc menyediakan alat yang serupa `-fdump-class-hierarchy'. Untuk kelas yang diberikan di atas, ia mengeluarkan (antara lain):

Class Class
   size=80 align=8
   base size=58 base align=8
Class (0x0x141f81280) 0
    vptridx=0u vptr=((&amp; Class::_ZTV5Class) + 24u)
  SBase1 (0x0x141f78840) 0
      primary-for Class (0x0x141f81280)
  SBase2 (0x0x141f788a0) 16
      vptr=((&amp; Class::_ZTV5Class) + 56u)
  SBase3 (0x0x141f78900) 28
  VBase (0x0x141f78960) 64 virtual
      vptridx=8u vbaseoffset=-24 vptr=((&amp; Class::_ZTV5Class) + 88u)

Ia tidak menyenaraikan pembolehubah ahli (atau sekurang-kurangnya saya tidak tahu bagaimana untuk mendapatkannya), tetapi anda boleh lihat yang mereka perlu Terletak di antara mengimbangi 28 dan 64, sama seperti dalam susun atur clang.

Anda boleh melihat bahawa kelas asas ditetapkan sebagai utama. Ini menghapuskan keperluan untuk pelarasan penunjuk ini apabila Kelas diakses sebagai SBase1.

Arahan pengkompil lain

Arahan setara berikut digunakan untuk penyusun berbeza:

  • gcc: $ g -fdump-class- hierarki - c layout.cpp
  • Visual C: cl main.cpp /c /d1reportSingleClassLayoutTest_A

Lihat: https://blogs.msdn.microsoft.com/vcblog/2007/ 05/ 17/mendiagnos-pelanggaran-odr-tersembunyi-dalam-visual-c-dan-pembetulan-lnk2022/

Atas ialah kandungan terperinci Bagaimanakah C menyusun objek dalam ingatan, dan apakah maksudnya untuk pemutus dinamik dan tafsiran semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn