Подтвердить что ты не робот

С++: POD Pros\Cons

  • Каковы плюсы и минусы используя Обычные старые данные (POD) structs\classes в С++?
  • В каких случаях следует использовать их по не-POD?
  • В частности, У POD есть преимущества при работе с каркасами сериализации? Возможно, при работе с кросс-платформенными и перекрестный язык?
4b9b3361

Ответ 1

Существует одно преимущество POD в сочетании с константами.

Если вы объявляете/определяете константу и используете для нее тип POD, весь POD помещается в секцию (константа) исполняемого файла/библиотеки и доступен после загрузки.

Если вы используете не-POD, конструктор должен запускаться для его инициализации. Поскольку порядок запуска конструкторов статических классов в С++ - это undefined, вы не можете получить доступ к статическому A из статического конструктора B или к любому коду, который вызывается из статического конструктора B.

Таким образом, использование POD в этом случае безопасно.

Ответ 2

Если у вас есть gazillion небольшие объекты, гарантируя, что эти объекты POD могут быть огромным преимуществом.

  • Вы можете вызывать calloc() или malloc() большой кусок из них, сохраняя при этом призывы к конструкторам gazillion.
  • Для настойчивости, а не для потоковой передачи объектов по одному, вы можете использовать fwrite() и fread() весь кусок из них для скорости.

Недостатком является то, что вы должны держать свой ум гибким, чтобы обрабатывать не-OOP POD в коде. POD - это откат от старого кода C, где вы знаете и заботитесь о макете своих данных. Когда этот макет хорошо определен, вы можете оптимизировать работу кусков памяти, а не много маленьких кусочков.

Обратите внимание, что то, что я описываю выше, относится к тривиально выложенным структурам. Другими словами, если вы вызываете type_trait std:: is_trivially_copyable() для этого типа, вы получите правду. Требования к POD на самом деле даже сильнее, чем требования к тривиально-копируемым структурам. Итак, то, что я только что описал выше, относится ко всем POD и даже к некоторым не-POD, которые, как оказалось, тривиально-совместимы.

Ответ 3

POD могут использоваться в интерфейсах C, что означает, что вы можете иметь библиотеку, написанную на С++, но с C-интерфейсом, который может быть полезен.

Недостатком является то, что вы не можете использовать конструктор, чтобы наложить нагрузку на инициализацию на сам тип - код пользователя должен будет позаботиться об этом.

Ответ 4

pods имеют некоторые тонкие преимущества. Я не знаю, какой переносной способ вычислить необходимый размер памяти для нового оператора [], если элементы массива не являются pod, поэтому достаточно использовать безопасное размещение нового оператора [] для такого массива. Если структура nonpod имеет деструктор, new [] нуждается в дополнительном пространстве для хранения размера массива, но этот дополнительный размер зависит от реализации (althogh обычно это sizeof (size_t) + (возможно) некоторое дополнение для обеспечения правильного выравнивания)