- Каковы плюсы и минусы используя Обычные старые данные (POD) structs\classes в С++?
- В каких случаях следует использовать их по не-POD?
- В частности, У POD есть преимущества при работе с каркасами сериализации? Возможно, при работе с кросс-платформенными и перекрестный язык?
С++: POD Pros\Cons
Ответ 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) + (возможно) некоторое дополнение для обеспечения правильного выравнивания)