Ответ 1
this
предоставляет адрес объекта, который не обязательно является адресом первого элемента. Единственным исключением являются так называемые стандартные макеты. Из стандарта С++ 11:
(9.2/20) Указатель на объект структуры стандартного макета, подходящим образом преобразованный с помощью
reinterpret_cast
, указывает на его начальный элемент (или если этот элемент является битовым полем, то к единице, в которой он находится ) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. - конечная нота]
Это определение типа стандартного макета:
(9/7) Класс стандартного макета - это класс, который:
- не имеет нестатических элементов данных типа нестандартного макета (или массива таких типов) или ссылки,
- не имеет виртуальных функций (10.3) и нет виртуальных базовых классов (10.1),
- имеет тот же контроль доступа (раздел 11) для всех нестатических элементов данных,
- не имеет базовых классов нестандартной компоновки,
- либо не имеет нестатических членов данных в самом производном классе и не более одного базового класса с нестатическими членами данных, либо не имеет базовых классов с нестатическими членами данных и
- не имеет базовых классов того же типа, что и первый нестатический элемент данных. [108][108] Это гарантирует, что два подобъекта, которые имеют один и тот же тип класса и принадлежат одному и тому же самому производному объекту, не выделяются по тому же адресу (5.10).
Обратите внимание, что тип объекта не должен быть POD – достаточно стандартного макета, как определено выше. (Все POD имеют стандартную компоновку, но, кроме того, они тривиально конструктивные, тривиально подвижные и тривиально скопируемые.)
Насколько я могу судить по вашему коду, ваш тип выглядит стандартным (убедитесь, что управление доступом одинаково для всех нестатических членов данных). В этом случае this
действительно укажет на начальный элемент. Что касается использования этого для целей сериализации, стандарт фактически говорит явно:
(9/9) [Примечание. Стандартные классы макета полезны для общения с кодом, написанным на других языках программирования. Их макет указан в 9.2. - конечная нота]
Конечно, это не решает все проблемы сериализации. В частности, вы не получите переносимости сериализованных данных (например, из-за несовместимости со знаком).