C++: POD и POD-упаковочные объекты

Часто я объявляю классы для переноса одного значения Plain Old Data; простые классы без виртуальных функций, такие как:

class Velocity {
    int vel;
public:
    // functions to work with velocity ...
}
  1. Работа с таким объектом такая же, как работа со значениями POD? - Есть ли разница в использовании пространства или времени, если в моем коде я использовал intвместо Velocity? Стандарт говорит что-нибудь об этом?

  2. Могу ли я привести указатель или массив таких объектов, как указатель / массив значений 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. Все, что происходит, определяется реализацией.

Другие вопросы по тегам