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

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

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

Сообщений: 2130



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

Racheengel,
Код
C++ (Qt)
#include <QVector>
#include <QtDebug>
 
struct A{
   A(){
       qDebug() << "Constructed";
       a_ = 0;
   }
   A(const A &other) {
       qDebug() << "Copied";
       a_ = other.a_;
   }
   float a_;
};
 
 
int main()
{
   QVector<A> vec;
   vec.reserve(3);
   vec.append(A());
 
   qDebug() << sizeof(A);
   return 0;
}
 

Цитировать
Constructed
Copied
4

Вроде, ничего лишнего
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

А как прикажете применить интринзики к QVector3D  Непонимающий
В памяти вектор QVector3D это последовательность float: x, y, z, x, y, z, ...
С помощью плохих кастов можно получить float*
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Вроде, ничего лишнего
Имеется ввиду:
Код
C++ (Qt)
QVector3D vec[ 100 ];
 
// или
 
QVector<QVector3D> vec( 100 );
 

В этих случаях 100 раз будет вызываться дефолтный конструктор QVector3D.

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

В памяти вектор QVector3D это последовательность float: x, y, z, x, y, z, ...
С помощью плохих кастов можно получить float*

Или x,y,z, [gap], x,y,z, [gap]

Кто гарантирует, что на разных платформах не появится никакого чудо-выравнивания, например?
Записан

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 не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Код
C++ (Qt)
#include <QVector>
#include <QVector3D>
#include <QtDebug>
#include <QTime>
 
 
int main()
{
   QTime time;
   time.start();
   QVector<QVector3D> vec(9999999);
   qDebug() << time.elapsed();
   return 0;
}

Цитировать
30

Насчёт гапов тоже интересуюсь. Только не нашёл ссылок на стандарт. В c99 они возможны. А что насчёт c++11?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Кто гарантирует, что на разных платформах не появится никакого чудо-выравнивания, например?
Стандарт. Структуры в памяти располагаются строго друг за другом.
Вот в самой структуре поля могут выравниваться, но они будут одинаково выравнены, что для:
Код
C++ (Qt)
struct vec
{
   float x;
   float y;
   float z;
};
 
vec v;
 

что для:
Код
C++ (Qt)
float v[ 3 ];
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Здесь заклинивает Qt "идеология", которая на первое место ставит "удобство использования". Это конечно хорошо, но в случае QVector3D это просто идет в ущерб качеству кода. Плохо просто все, начиная с имени класса. QVecоr3D - оказывается "3D" надо понимать как  "трехмерный", а не "3 double ". Напр QVec3f было бы уместнее. Имена методов не лучше, напр

QVector3D::dotProduct
QVector3D::crossProduct

Эти операции настолько ходовые что часто их делают даже операторами. А тут длинные static портянки которые задолбают через неделю работы.

Ладно, не будем придираться к именам, содержательная часть
Код:
QVector3D QVector3D::normalized() const
{
    // Need some extra precision if the length is very small.
    double len = double(xp) * double(xp) +
                 double(yp) * double(yp) +
                 double(zp) * double(zp);
    if (qFuzzyIsNull(len - 1.0f)) {
        return *this;
    } else if (!qFuzzyIsNull(len)) {
        double sqrtLen = sqrt(len);
        return QVector3D(float(double(xp) / sqrtLen),
                         float(double(yp) / sqrtLen),
                         float(double(zp) / sqrtLen));
    } else {
        return QVector3D();
    }
}
Отак от! Оказывается выбор между normalize() и normalize_safe() (нормализация с проверкой) Qt пользователю не нужен. Будем просто сами всегда проверять (удобство использования), а не удается нормировать - вернем нулевой, пусть будет Nan на следующей операции. Перлы с fuzzy  из той же оперы. Как можно было накосячить в том что прекрасно известно десятки лет - хз.

Идиотское setX(Y, Z) - нет слов

distanceToXXX - на мой взгляд, просто оскорбление. Типа "ты ничего в геометрии не рубишь, записать 1 строку тебе тяжело. Не беда - мы вот сделали такой чудесный класс что и без всяких познаний (чисто на букваре) все сделаешь! Кормись, лошок, кормись!". Зачем же так плохо думать о пользователе?  Плачущий Плачущий

SSE нет и намека, хотя люди его уже лет 10 имеют. По нынешним временам это просто неприлично. Кстати, именно поэтому не спешите городить свой класс.

Зато да, для человека с этим никогда не работавшего - все прекрасно, просто отлично. Но ведь это надувательство.  Ладно, будем надеяться что таких классов в Qt немного, и на солнце есть пятна
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

У вас очень тонкая грань между "удобство использования" и "Кормись, лошок"
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Насчет "одинакового выравнивания везде и всегда", увы, не соглашусь.

http://stackoverflow.com/questions/5397447/struct-padding-in-c

Да и практика иное показывает.
Записан

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 не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

А для float, float, float такие примеры есть?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Насчет "одинакового выравнивания везде и всегда", увы, не соглашусь.

http://stackoverflow.com/questions/5397447/struct-padding-in-c

Да и практика иное показывает.
Еще раз.
Структуры в памяти всегда располагаются без паддинга, одна к одной.
Паддинг внутри структуры может отличаться в зависимости от архитектуры, но ровно такой-же паддинг будет и при упаковки массива таких типов. Проще говоря структура из 3 float всегда будет выравниваться также как и массив из 3 float.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

/offtop

"reinterpret_cast класса в массив"
Из-за подобных хитростей программист с++ и может цитирую
Цитировать
...стрелять себе в ногу, стрелять себе в ногу с выдумкой, в другую ногу, одной ногой стрелять в другую ногу...

Продолжайте срач Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

У вас очень тонкая грань между "удобство использования" и "Кормись, лошок"
А почему Вы думаете она вообще существует?
Цитировать
Отважный разведчик - подлый шпион
Опытный профессионал - продажная сука
и.т.п.
Очень разная эмоциональная окраска - но смысл-то одинаков Улыбающийся

Насчет "одинакового выравнивания везде и всегда", увы, не соглашусь.
Ах как мы блещем знанием хабровских статеек! Пусть вопрос не стоит выеденного яйца (всегда можно использовать stride) - но не напрасно же читал!  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

/offtop

"reinterpret_cast класса в массив"
Из-за подобных хитростей программист с++ и может цитирую
Цитировать
...стрелять себе в ногу, стрелять себе в ногу с выдумкой, в другую ногу, одной ногой стрелять в другую ногу...

Продолжайте срач Улыбающийся
Ну на самом деле это действительно очень гадкий хак и я бы им не пользовался. Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Old, а что бы вы сделали?
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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