C ++: POD и POD-упаковочные объекты - PullRequest
2 голосов
/ 08 ноября 2010

Часто я объявляю классы, чтобы обернуть одно значение 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 ]

4 голосов
/ 08 ноября 2010

Работа с таким объектом аналогична работе со значениями POD?

Нет.Вы не совсем можете использовать memcpy и друзей на нем (разрешено только для POD!).

Могу ли я привести указатель или массив таких объектов, как указатель / массив значений PODи наоборот?

Если это POD, вы в полной безопасности.Но это не POD, потому что у него есть личный элемент данных.


Обе из сказанного, на практике это будет нормально работать для этого класса (а в C ++ 0x вам разрешено использовать для использования такой класс с закрытыми членами с memcpy, потому что он разрешает его для всех тривиально копируемых типов, включая ваш тип и многие другие не-POD).

4 голосов
/ 08 ноября 2010

Re "такое же, как POD", не полностью в C ++ 98.C ++ 98 не разрешает POD иметь закрытых членов.C ++ 0x снимает это ограничение (и некоторые другие).

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

Попросите ваш компилятор оптимизировать, а затем измерятьэто имеет значение.

Повторное приведение: нет, это имеет определенный эффект реализации.Не делай этого.

Приветствия & hth.,

1 голос
/ 08 ноября 2010

1) Ваш пример не POD, потому что у класса есть приватное поле

2) Стандарт не определяет, что происходит при использовании reinterpret_cast.Все, что происходит, определяется реализацией.

...