Информация об изменениях

Сообщение placement new от 10.12.2022 17:46

Изменено 10.12.2022 17:55 maks1180

placement new
Допустим есть 2 класса:
сlass A {
public: int v1; int v2;
};

class B: public сlass A {
int v3;
B() { v3 = 1; }
};

сначала я создал экземпляр Class A через placement new
new(p)A();
поработал с ним, потом создал Class B, на тот же месте где был Class A
new(p)B();

1) Есть ли гарантии, что v1 и v2 класс A и В будут по одинаковым смещениям ?
2) Есть ли гарантии, что конструктор класса B не перетрёт значения v1, v2 которые остались в памяти от прошлого экземпляра класса A ?

Таким образом я хочу динамически изменить класс объекта сохранив его в той же области памяти.
Или может можно как-то поменять v-table у объекта и он станет объектом другого класса ?
placement new
Допустим есть 2 класса:
сlass A {
public: int v1; int v2;
};

class B: public сlass A {
int v3;
B() { v3 = 1; }
};

сначала я создал экземпляр сlass A через placement new
new(p)A();
поработал с ним, потом создал сlass B, на тот же месте где был Class A
new(p)B();

1) Есть ли гарантии, что v1 и v2 класс A и В будут по одинаковым смещениям ?
2) Есть ли гарантии, что конструктор класса B не перетрёт значения v1, v2 которые остались в памяти от прошлого экземпляра класса A ?

Таким образом я хочу динамически изменить класс объекта сохранив его в той же области памяти.
Или может можно как-то поменять v-table у объекта и он станет объектом другого класса ?

Такое изощерение для того что-бы не вызывать epoll_ctl(..., EPOLL_CTL_MOD) при смене адреса, который занимает около 4100 тактов.