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

Сообщение Re: reinterpret_cast<CClass*>(raw_ptr) от 24.08.2015 13:14

Изменено 24.08.2015 13:22 watchmaker

Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно. Бинарное представление этого класса простое — 3 дабла и все.

RTT>Какого будет мнение?
Для standard-layout структур это разрешено. Даже в стандарте есть пример с reinterpret_cast и complex<T>, который, очевидно, отличается от твоего примера лишь тем, что у тебя три числа, а не два.

Хотя с массивом таких гарантий нет — то есть нельзя сначала сделать каст к указателю на массив векторов, а потом его индексировать, а нужно каждый раз делать новый каст:
Vector* p = AsVector3(vertices+i*3);
use(p[0]) //  можно
use(p[1]) //  нельзя

но в то же время
use(AsVector3(vertices+(i+0)*3)); //  можно 
use(AsVector3(vertices+(i+1)*3)); //  можно

Хотя практически везде будут оба варианта работать пока не встретится где-нибудь, например, агрессивное выравнивание.




RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно


А не рассматривался вариант с классом SuperPooperVector3View, который также умеет всё что нужно, но не владеет данными, а содержит лишь содержит ссылку на первый double? Тогда такой класс можно без всяких reinterpret_cast сконструировать как из SuperPooperVector3, так и из голого массива.
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно. Бинарное представление этого класса простое — 3 дабла и все.

RTT>Какого будет мнение?
Для standard-layout структур это разрешено. Даже в стандарте есть пример с reinterpret_cast и complex<T>, который, очевидно, отличается от твоего примера лишь тем, что у тебя три числа, а не два.

Хотя с массивом таких гарантий нет — то есть нельзя сначала сделать каст к указателю на массив векторов, а потом его индексировать, а нужно каждый раз делать новый каст:
Vector3* p = &AsVector3(vertices+i*3);
use(p[0]) //  можно
use(p[1]) //  нельзя

но в то же время
use(AsVector3(vertices+(i+0)*3)); //  можно 
use(AsVector3(vertices+(i+1)*3)); //  можно

Хотя практически везде будут оба варианта работать пока не встретится где-нибудь, например, агрессивное выравнивание.




RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно


А не рассматривался вариант с классом SuperPooperVector3View, который также умеет всё что нужно, но не владеет данными, а содержит лишь содержит ссылку на первый double? Тогда такой класс можно без всяких reinterpret_cast сконструировать как из SuperPooperVector3, так и из голого массива.