Более чистый способ преобразования массива компактных значений с плавающей точкой в ​​массив с плавающей точкой - PullRequest
0 голосов
/ 22 апреля 2020

Перед актуальным вопросом небольшая прелюдия. Я не беспокоюсь о безопасности, я забочусь о производительности. Я ЗНАЮ, что это неправильно, и я знаю, что это очень хакерски, однако это довольно быстро.

vector<float> result = move(*((vector<float>*)&vertices));

Этот код злоупотребляет приведениями и указателями в стиле C, чтобы заставить компилятор интерпретировать массив левой стороны vertices, который представляет собой вектор компактного типа, в котором все поля являются числами с плавающей точкой как массив чисел с плавающей точкой.

т.е.

struct vertex {
   float x;
   float y;
   float z;
}
vector<vertex> vertices;

Это работает и делает то, что это необходимо, однако это несколько трудно читать. Я хочу знать, есть ли другой способ достижения того же результата более читабельным способом.

1 Ответ

1 голос
/ 22 апреля 2020

Больше всего вас должно волновать то, что код вашего поведения имеет вид undefined , поскольку приведение является нарушением правила строго псевдонимов . Обратите внимание, что vector<vertex> - это тип, совершенно отличный от , от vector<float>.

В частности, вы предполагаете, что данные в struct являются смежными и в * нет заполнения 1012 *, даже в конце.

Почему бы не использовать vector<float> из get- go с пометкой для себя, что 4-й элемент начинает следующий треугольник, и так далее?

...