Сообщение 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>, который, очевидно, отличается от твоего примера лишь тем, что у тебя три числа, а не два.
Хотя с массивом таких гарантий нет — то есть нельзя сначала сделать каст к указателю на массив векторов, а потом его индексировать, а нужно каждый раз делать новый каст:
но в то же время
Хотя практически везде будут оба варианта работать пока не встретится где-нибудь, например, агрессивное выравнивание.
RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно
А не рассматривался вариант с классом SuperPooperVector3View, который также умеет всё что нужно, но не владеет данными, а содержит лишь содержит ссылку на первый double? Тогда такой класс можно без всяких reinterpret_cast сконструировать как из SuperPooperVector3, так и из голого массива.
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>, который, очевидно, отличается от твоего примера лишь тем, что у тебя три числа, а не два.
Хотя с массивом таких гарантий нет — то есть нельзя сначала сделать каст к указателю на массив векторов, а потом его индексировать, а нужно каждый раз делать новый каст:
но в то же время
Хотя практически везде будут оба варианта работать пока не встретится где-нибудь, например, агрессивное выравнивание.
RTT> имеется класс для работы с вектором SuperPooperVector3, который умеет все что нужно
А не рассматривался вариант с классом SuperPooperVector3View, который также умеет всё что нужно, но не владеет данными, а содержит лишь содержит ссылку на первый double? Тогда такой класс можно без всяких reinterpret_cast сконструировать как из SuperPooperVector3, так и из голого массива.
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, так и из голого массива.