Russian Qt Forum
Июня 27, 2025, 10:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: reinterpret_cast класса в массив  (Прочитано 25709 раз)
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
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #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]   Вверх
  Печать  
 
Перейти в:  


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