Russian Qt Forum
Май 21, 2024, 18:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: reinterpret_cast класса в массив  (Прочитано 22958 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #45 : Январь 21, 2016, 16:44 »

Ах как мы блещем знанием хабровских статеек! Пусть вопрос не стоит выеденного яйца (всегда можно использовать stride) - но не напрасно же читал!  Улыбающийся

Вот есть у нас 3 флота. На 3д вектор это 12 байт, верно? Допустим, у нас 10 миллионов векторов. Это 120 мегабайт (примерно). Каждый страйд плюс 1 байт означает, что как минимум 10 мб будут уходить в нирвану. Много это или мало? Вроде бы мало, да. Но тут 10, там 10, и кто знает, как оно через пару месяцев будет, с какими данными (какого объема) придет зоказчег...

Ну то есть, мелочь, конечно же... А потом народ удивляется - купили комп с 4 гигами памяти, только винда голая стоит, а 3 гига уже заняты с прыжка Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #46 : Январь 21, 2016, 16:48 »

Каждый страйд плюс 1 байт означает, что как минимум 10 мб будут уходить в нирвану.
Не один а 4 (40 Mb). Но все SSE (AVX и.т.п) требует чтобы адрес был выровнен на 16, иначе exception. Поэтому на эти расходы идут, скорость важнее
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #47 : Январь 21, 2016, 16:49 »

Old, а что бы вы сделали?
Ниже мысли без долгих обдумываний, так сказать, что сразу в голову пришло. Улыбающийся

Была бы коллекция точек, на нижнем уровне они хранились бы в обычном векторе float, что позволяло бы легко кастить ее в float*.
И был бы класс СсылкаНаТочку, объект которого мог-бы работать с данными из вышеуказанной коллекции.

Набросок:
Код
C++ (Qt)
class VecRef
{
public:
   VecRef( float *v ) : m_data( v ) {}
 
   float    &x() const { return m_data[ 0 ]; }
   float    &y() const { return m_data[ 1 ]; }
   float    &z() const { return m_data[ 2 ]; }
 
private:
   float    *m_data;
};
 

Т.е. сама ссылка данные о точке не хранит, а имеет указатель на первый float точки из коллекции.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #48 : Январь 21, 2016, 17:19 »

Каждый страйд плюс 1 байт означает, что как минимум 10 мб будут уходить в нирвану.
Не один а 4 (40 Mb). Но все SSE (AVX и.т.п) требует чтобы адрес был выровнен на 16, иначе exception. Поэтому на эти расходы идут, скорость важнее

Очень спорно. Прирост скорости будет от нулевого до ничтожного, если использовать команды "с выравниванием" вместо команд "без выравнивания". Кэш все-таки свою работу делает)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #49 : Январь 21, 2016, 17:36 »

Очень спорно.
Спорно или нет - но так делают.

Прирост скорости будет от нулевого до ничтожного,
Прирост может быть очень приличным (конечно зависит от задачи)
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 22.