Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: deMax от Июля 02, 2013, 11:53



Название: qtcreator 2.7.1 подчеркивает верный код
Отправлено: deMax от Июля 02, 2013, 11:53
Код:
class A
{
    float a[2][2];
public:
    float (&value())[2][2]{return a;}
}

main(){
A a;
float (&b)[2][2] = a.value;
}
Версия qtcreator 2.4.1 отображает нормально, в версии 2.7.1 подчеркивает красным строчку после "public:". Компилируется и работает правильно.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: Bepec от Июля 02, 2013, 12:00
оффтоп: На будущее - теги html в теге code не работают.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: deMax от Июля 03, 2013, 10:34
Убрал html тег.

Можно ли в QtCreator поставить метку для анализатора кода, чтобы он пропускал это место. Весь код после этой строчки не попадает в автодополнение.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: m_ax от Июля 03, 2013, 10:53
Откуда вообще такая необходимость в подобном костыле?


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: CuteBunny от Июля 03, 2013, 11:41
Откуда вообще такая необходимость в подобном костыле?

+1


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: deMax от Июля 04, 2013, 08:43
Откуда вообще такая необходимость в подобном костыле?
немного лирики bash.org:
Цитировать
14:14
Лесной ООП, однако
Смотрю код высоконагруженного сервера. В ядре обсчёта вижу код типа:

func() {
ObjectGame* OG=MainOG;
while(OG->next!=NULL)
{
ia=(int*)OG+12;
i=*ia;
/* что-то делает*/
*ia=i;
/* код функции, внутри функции ia претерпевает различные изменения*/
OG=OG->next;
}
}

С большими глазами иду к прогеру, который это всё написал. Спрашиваю: почему он не пользуется методами Set и Get, и вообще, почему именно 12 байт?

На что он мне отвечает: «Внутри кода функции есть ветвящийся цикл, в котором перебираются многие параметры объекта. Если пользоваться методами Set и Get, а это переход по адресу, причём у каждого объекта он свой, конвейер процессора офигеет и сбросится. Это плюс 30 тактов на каждый переход. Всего таких объектов в секунду надо обсчитать порядка нескольких миллионов. Частота ядра — три миллиарда операций в секунду. Отсюда вывод: идите вы лесом со своим ООП!»

В том месте подключен си-шный код и места весьма нагруженные. Я понимаю, что быстродействие почти такое же (к указателю добавляем смещение массива, а тут к this добавим смещение a и смещение массива)
Код:
inline value(int i,int j) {return a[i][j];}

но хочется работать с массивом через "[ i ] [ j ]" а не через "(i,j)". (много математических строк "v[ i ][ j ]", заменять их на "a->value(i,j)" некрасиво, тем более в формулах)


p.s. creator 2.7.2 тоже подчеркивает.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: ViTech от Июля 04, 2013, 11:10
Я, как и qtcreator 2.7.1 (и 2.7.2 тоже), давно не встречал таких странных конструкций :). Может чего не понимаю...

Выражения типа "float (&b)[2][2]" предлагается по всему коду таскать? Если ввести нормальный тип, то все становится намного понятней. Например, так:
Код:
typedef float Array_2x2[2][2];

class A
{
    Array_2x2 a;

public:
    Array_2x2 &value() { return a; }
};

int main()
{
    A a;
    cout << "a[1][1]=" << a.value()[1][1] << endl;

    Array_2x2 &b = a.value();

    b[1][1] = 5;
    cout << "b[1][1]=" << b[1][1] << endl;
    cout << "a[1][1]=" << a.value()[1][1] << endl;

    return 0;
}
Это если я правильно понял задумку автора. Хотя такая организация и использование класса А тоже может быть спорной.

Цитировать
Если пользоваться методами Set и Get, а это переход по адресу, причём у каждого объекта он свой, конвейер процессора офигеет и сбросится.
Программист с баша так же хорошо знает про inline методы класса как и про конвейер процессора? :) И, заодно, как компилятор выравнивает данные класса в памяти. Я бы ему предложил такой вывод: выходи из леса и учи С++.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: CuteBunny от Июля 04, 2013, 11:13
Интересно... Получается, возврат ссылки на массив массивов лучше, чем перегрузить оператор []?


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: ViTech от Июля 04, 2013, 11:29
Это смотря что от класса требуется. Я написал аналог того, что было у автора. Если надо будет передавать значение value в другие методы, то лучше :). Я так подозреваю, что в том классе много чего еще должно быть. Или вообще такой класс не нужен. Зависит от поставленной задачи.


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: deMax от Июля 04, 2013, 14:37
Выражения типа "float (&b)[2][2]" предлагается по всему коду таскать? Если ввести нормальный тип, то все становится намного понятней. Например, так:
Код:
typedef float Array_2x2[2][2];
Программист с баша так же хорошо знает про inline методы класса как и про конвейер процессора? :) И, заодно, как компилятор выравнивает данные класса в памяти. Я бы ему предложил такой вывод: выходи из леса и учи С++.
Спасибо за напоминание про typedef.
если задать float a[2][2], то возврат typedef float Array_2x2[2][2] работает, а без жирной двойки нет, хотя эта двойка вообще не нужна.

Программист из Баша не прав магическим числом 12, его надо было задать через offsetof. В критических участках кода даже функции лесом идут, а иногда и с++. (впрочем производительность растет, и частенько скорость разработки отодвигает оптимизацию).


Название: Re: qtcreator 2.7.1 подчеркивает верный код
Отправлено: b-s-a от Июля 05, 2013, 17:17
в критических местах надо начинать с включения опции -O3 компилятора. Если не помогло, то посмотреть дизассемблер и, если надо, ряд функций пометить inline. А за код "ia=(int*)OG+12;" надо руки на месте отрывать - это явно доступ к типичному элементу объекта.