Ответ 1
Есть ли гарантия, например. что общедоступные переменные будут первыми в а затем частную переменную?
Нет, такая гарантия не - С++ 11 standard, [class.mem]/14:
Нестационарные члены данных (неединичного) класса с одинаковым доступом control (раздел 11) распределяются так, что более поздние члены имеют более высокий адресов внутри объекта класса. Порядок распределения нестатических члены данных с различным контролем доступа не определены (11).
Итак,
struct A
{
int i, j;
std::string str;
private:
float f;
protected:
double d;
};
Гарантируется, что для данного объекта типа A
,
-
i
имеет меньший адрес, чемj
и -
j
имеет меньший адрес, чемstr
Обратите внимание, что ключи класса struct
и class
не имеют никакого отношения к компоновке: их единственная разница - права доступа, которые существуют только во время компиляции.
Он говорит только о порядке, но не о том, что первая переменная действительно начинается на "первом адресе"? Давайте предположим класс без наследования.
Да, но только для классов стандартного макета. Существует ряд требований, которые класс должен удовлетворять классу стандартного макета, одним из которых является то, что все члены имеют один и тот же контроль доступа.
Цитирование С++ 14 (то же самое относится к С++ 11, но формулировка более косвенная), [class.mem]/19:
Если объект класса стандартного макета имеет нестатические элементы данных, его адрес совпадает с адресом его первых нестатических данных член. В противном случае его адрес совпадает с адресом его первого base classsubobject (если есть). [Примечание: возможно, неназванное заполнение в рамках объекта структуры стандартного макета, но не в его начале, по мере необходимости для достижения соответствующего выравнивания. - конечная нота]
[класс]/7:
Класс стандартного макета - это класс, который:
- не имеет нестатических членов данных типа нестандартного макета класса (или массива таких типов) или ссылки,
- не имеет виртуальных функций (10.3) и нет виртуальных базовых классов (10.1),
- имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,
- не имеет базовых классов нестандартной компоновки,
- либо не имеет нестатических членов данных в самом производном классе и не более одного базового класса с нестатическими членами данных, либо не имеет базы классы с нестатическими элементами данных и
- не имеет базовых классов того же типа, что и первый нестатический член данных. 110
110) Это гарантирует, что два подобъекта, которые имеют один и тот же тип класса и которые принадлежат одному и тому же самому производному объекту, не являются выделенных по тому же адресу (5.10).