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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: qtcreator 2.7.1 подчеркивает верный код  (Прочитано 6447 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Июль 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:". Компилируется и работает правильно.
« Последнее редактирование: Июль 03, 2013, 10:28 от deMax » Записан
Bepec
Гость
« Ответ #1 : Июль 02, 2013, 12:00 »

оффтоп: На будущее - теги html в теге code не работают.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Июль 03, 2013, 10:34 »

Убрал html тег.

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

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Июль 03, 2013, 10:53 »

Откуда вообще такая необходимость в подобном костыле?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
CuteBunny
Гость
« Ответ #4 : Июль 03, 2013, 11:41 »

Откуда вообще такая необходимость в подобном костыле?

+1
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Июль 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 тоже подчеркивает.
« Последнее редактирование: Июль 04, 2013, 09:23 от deMax » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Июль 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 методы класса как и про конвейер процессора? Улыбающийся И, заодно, как компилятор выравнивает данные класса в памяти. Я бы ему предложил такой вывод: выходи из леса и учи С++.
Записан

Пока сам не сделаешь...
CuteBunny
Гость
« Ответ #7 : Июль 04, 2013, 11:13 »

Интересно... Получается, возврат ссылки на массив массивов лучше, чем перегрузить оператор []?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #8 : Июль 04, 2013, 11:29 »

Это смотря что от класса требуется. Я написал аналог того, что было у автора. Если надо будет передавать значение value в другие методы, то лучше Улыбающийся. Я так подозреваю, что в том классе много чего еще должно быть. Или вообще такой класс не нужен. Зависит от поставленной задачи.
Записан

Пока сам не сделаешь...
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Июль 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. В критических участках кода даже функции лесом идут, а иногда и с++. (впрочем производительность растет, и частенько скорость разработки отодвигает оптимизацию).
« Последнее редактирование: Июль 04, 2013, 14:48 от deMax » Записан
b-s-a
Гость
« Ответ #10 : Июль 05, 2013, 17:17 »

в критических местах надо начинать с включения опции -O3 компилятора. Если не помогло, то посмотреть дизассемблер и, если надо, ряд функций пометить inline. А за код "ia=(int*)OG+12;" надо руки на месте отрывать - это явно доступ к типичному элементу объекта.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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