C++: POD и POD-упаковочные объекты
Часто я объявляю классы для переноса одного значения Plain Old Data; простые классы без виртуальных функций, такие как:
class Velocity {
int vel;
public:
// functions to work with velocity ...
}
Работа с таким объектом такая же, как работа со значениями POD? - Есть ли разница в использовании пространства или времени, если в моем коде я использовал
int
вместоVelocity
? Стандарт говорит что-нибудь об этом?Могу ли я привести указатель или массив таких объектов, как указатель / массив значений POD и наоборот? - Я в полной безопасности?
Velocity *v = reinterpret_cast< Velocity* >( int_pointer )
?
3 ответа
Работа с таким объектом такая же, как работа со значениями POD?
Нет. Вы не совсем безопасны в использовании memcpy
и друзья на нем (разрешено только на PODs!).
Могу ли я привести указатель или массив таких объектов, как указатель / массив значений POD и наоборот?
Если это POD, вы в полной безопасности. Но это не POD, потому что у него есть личный элемент данных.
И то, и другое говорит, что на практике это будет хорошо работать для этого класса (а в C++0x вам разрешено использовать такой класс с закрытыми членами с memcpy
, потому что он позволяет это для всех тривиально копируемых типов, включая ваш тип и многие другие не POD).
Re "такой же, как POD", не полностью в C++98. C++98 не позволяет POD иметь частных членов. C++0x снимает это ограничение (и некоторые другие).
Эффективность или ее отсутствие - это проблема качества реализации.
Попросите ваш компилятор оптимизировать, а затем измерить, если это имеет значение.
Повторное приведение: нет, это имеет определенный эффект реализации. Не делай этого.
Ура & hth.,
1) Ваш пример не POD, потому что у класса есть приватное поле
2) Стандарт не определяет, что происходит при использовании reinterpret_cast. Все, что происходит, определяется реализацией.