Рубрики

Почему размер пустого класса не равен нулю в C ++?

Предсказать вывод следующей программы?

#include<iostream>

using namespace std;

  

class Empty {};

  

int main()

{

  cout << sizeof(Empty);

  return 0;

}

Выход:

1

Размер пустого класса не равен нулю. Обычно это 1 байт. Ненулевое значение гарантирует, что два разных объекта будут иметь разные адреса. Смотрите следующий пример.

#include<iostream>

using namespace std;

  

class Empty { };

  

int main()

{

    Empty a, b;

  

    if (&a == &b)

      cout << "impossible " << endl;

    else

      cout << "Fine " << endl;

  

   return 0;

}

Выход:

Fine

По той же причине (разные объекты должны иметь разные адреса) «new» всегда возвращает указатели на разные объекты. Смотрите следующий пример.

#include<iostream>

using namespace std;

  

class Empty { };

  

int main()

{

    Empty* p1 = new Empty;

    Empty* p2 = new Empty;

  

    if (p1 == p2)

        cout << "impossible " << endl;

    else

        cout << "Fine " << endl;

  

    return 0;

}

Выход:

Fine

Теперь угадайте вывод следующей программы (это сложно)

#include<iostream>

using namespace std;

  

class Empty { };

  

class Derived: Empty { int a; };

  

int main()

{

    cout << sizeof(Derived);

    return 0;

}

Вывод (с компилятором GCC. Смотрите это ):

4 

Обратите внимание, что результат не больше 4. Существует интересное правило, которое говорит, что пустой базовый класс не должен быть представлен отдельным байтом. Таким образом, компиляторы могут выполнять оптимизацию в случае пустых базовых классов. В качестве упражнения попробуйте следующую программу на вашем компиляторе.

// Спасибо Venki за предложение этого кода.
#include <iostream>

using namespace std;

   

class Empty

{};

   

class Derived1 : public Empty

{};

   

class Derived2 : virtual public Empty

{};

   

class Derived3 : public Empty

{    

    char c;

};

   

class Derived4 : virtual public Empty

{

    char c;

};

   

class Dummy

{

    char c;

};

   

int main()

{

    cout << "sizeof(Empty) " << sizeof(Empty) << endl;

    cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;

    cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;

    cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;

    cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;    

    cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;

   

    return 0;

}

Источник:
http://www2.research.att.com/~bs/bs_faq2.html

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Почему размер пустого класса не равен нулю в C ++?

0.00 (0%) 0 votes