2010-11-07 5 views
2

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

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

  2. Можно ли указать указатель или массив таких объектов, как указатель/массив значений POD и наоборот? - Я полностью в безопасности делаю Velocity *v = reinterpret_cast< Velocity* >(int_pointer)?

ответ

4

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

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

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

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


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

1

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

2) Стандарт не определяет, что происходит, когда используется reinterpret_cast. Все, что происходит, - это реализация.

4

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

Эффективность или недостаток, это проблема качества выполнения.

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

Re casting: no, у которого есть определенный эффект реализации. Не делай этого.

Cheers & hth.,

Смежные вопросы