Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
13 / 13 / 3
Регистрация: 30.06.2013
Сообщений: 168

Какие есть хитрости и трюки, уменьшающие размер кода и увеличивающие быстродействие

12.09.2014, 08:01. Показов 4818. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
скажите какие есть хитрости и трюки в языкe c++ уменьшающие размер кода и увеличивающие быстродействие
например
C++
1
тернарный оператор (x>y)?x:y; и и булевая return a==b;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2014, 08:01
Ответы с готовыми решениями:

Какие есть правила по написанию кода в VB?
В процессе работы с большими проектами стала интересовать информация о правильном написании кода. Встечал ли кто-нибуть рекомендации,...

Есть ли какие-то общие рекомендации по организации кода на Си?
Здравствуйте! Есть следующий вопрос. Есть ли какие-то общие рекомендации по организации кода, конкретно по файлам и папкам. Например, я...

Использование C++ кода внутри программы на C: какие есть варианты?
Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в программе на C. Переписывать заново функции с...

19
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.09.2014, 08:38
Цитата Сообщение от Hsac Посмотреть сообщение
например
в чем хитрость или трюк?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.09.2014, 09:00
Хитростей и трюков много разных. Вообще, их принято называть "идиомами". Только, как правило, либо ты уменьшаешь размер кода (и часто в ущерб понятности), либо увеличиваешь быстродействие. Редко бывает так, чтобы получилось и скорость увеличить, и размер кода уменьшить, и читаемость повысить.

Примеры идиом C++:
C++
1
2
3
4
5
6
7
8
// проверка на чётность:
std::cout << "Enter number (it shall be an integer value): ";
int a;
std::cin >> a;
if (a & 1)
    std::cout << "The value of number you entered is odd.";
else
    std::cout << "The value of number you entered is even.";
Условие в скобках ифа - одна из таких идиом.

Добавлено через 11 минут
C++
1
2
// передача в функцию массива при помощи указателя, записанного в нотации массивов:
void fill_arr(int arr[], int arrSize);
Первый параметр в функции - это указатель на первый элемент массива arr, а не сам массив arr, как можно было бы подумать. Просто указатель записан в обычной нотации массивов. Это тоже идиома.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.09.2014, 09:39
Цитата Сообщение от Hsac Посмотреть сообщение
скажите какие есть хитрости и трюки в языкe c++ уменьшающие размер кода и увеличивающие быстродействие
- передача аргумента по указателю или ссылке;
- move semantic;
- использование const;
- вычисления в compile time;
- размещение элементов структур/классов с учетом выравнивания;
- отказ от исключений и RTTI;
- оптимизация условных выражений в конструкции if;
- использование префиксной формы инкремента/декремента;
- и т.д.
4
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,988
Записей в блоге: 32
12.09.2014, 11:17
Идиомы имхо не про то. Для начала представлять себе "как оно будет выглядеть в скомпилированном асм-виде" и хотя бы явных глупостей не делать, например целый счетчик цикла флоатом. А потом уже и блох можно ловить, вплоть до отказа от оборачивания операций в отдельные не инлайновые функции.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.09.2014, 12:36
Цитата Сообщение от _Ivana Посмотреть сообщение
потом уже и блох можно ловить
В общем случае, наверное можно сказать, что трюки и хитрости - это:
  • попросту достаточное знание основ С++, плюс STL, плюс BOOST
  • спуск на более низкие уровни абстракции (от C++ к Cи, от Си к ассемблеру) с целью увеличения эффективности кода

Цитата Сообщение от _Ivana Посмотреть сообщение
Идиомы имхо не про то.
Может и не про то, но топикстартер, похоже, именно их имел ввиду.

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
хотя бы явных глупостей не делать, например целый счетчик цикла флоатом
Это в мой огород самосвал что ли? :D

0
12.09.2014, 12:43

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Это в мой огород самосвал что ли?
Не только, таких любителей огородников много, даже ники себе выбирают соответствующие в честь такого подхода :D: Не выводится количество введенных символов

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.09.2014, 12:50
Цитата Сообщение от Hsac Посмотреть сообщение
скажите какие есть хитрости и трюки в языкe c++
Ну, или так (как вариант): трюки и хитрости.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
12.09.2014, 17:38
Цитата Сообщение от gru74ik Посмотреть сообщение
Условие в скобках ифа - одна из таких идиом.
не понял, это что то типа проверки на четность? а я обычно пишу if (a / 2) смысл тот же, но понятнее... а как ваше условие работает и что делает я лично не понимаю...
Цитата Сообщение от gru74ik Посмотреть сообщение
Первый параметр в функции - это указатель на первый элемент массива arr, а не сам массив arr, как можно было бы подумать. Просто указатель записан в обычной нотации массивов. Это тоже идиома.
вот это вообще не понял... обычно массивы указателем передают разве нет? т.е. вот так int* arr
Цитата Сообщение от Убежденный Посмотреть сообщение
move semantic
это еще что вообще?
Цитата Сообщение от Убежденный Посмотреть сообщение
вычисления в compile time
имеются ввиду параметрезированные макросы и инлайн функции?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
12.09.2014, 17:51
Я знаю один простой но очень эффективный трюк это настройки компилятора.
Visual Studio:
/O1 - наименьший размер.
/О2 - наибольшая скорость.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
12.09.2014, 18:01
GetHelp, про четность. число ANDится с числом 1. при этом получится 1, если последний бит в числе был 1 иначе получится ноль. А если последний бит в числе был 1, то число нечетно. Таким же образом можно проверить число на делимость на 4. if(val & 3) и т.д. Ну тут типо вся фишка в том, что битовые операции быстрее работают)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.09.2014, 18:04
Цитата Сообщение от GetHelp Посмотреть сообщение
не понял, это что то типа проверки на четность?
Даже в комментарии к коду написано.
Цитата Сообщение от GetHelp Посмотреть сообщение
вот это вообще не понял... обычно массивы указателем передают разве нет? т.е. вот так int* arr
записи void f(int* arr) и void f(int arr[]) эквивалентны.
Цитата Сообщение от gru74ik Посмотреть сообщение
Просто указатель записан в обычной нотации массивов. Это тоже идиома.
Оно зачем и для кого? Профита особого не вижу, как и идиоматичности такой записи.
Цитата Сообщение от GetHelp Посмотреть сообщение
это еще что вообще?
move semantic - семантика перемещения. Вместо копирования объекта позволяет дешево переместить его содержимое посредством использования move конструктора или оператора присваивания. Выстреливает при возврате больших объектов из функции. Или, например, в векторе при реаллокации памяти объекты из прежнего участка памяти можно переместить в новый при условии, что move-конструктор/оператор присваивания не генерируют исключений.
Закапываться в объяснения смысла не вижу, все давно написано в книгах, адаптированных под стандарт С++11.
Цитата Сообщение от GetHelp Посмотреть сообщение
имеются ввиду параметрезированные макросы и инлайн функции?
Прежде всего, шаблоны. На форуме даже тема есть - https://www.cyberforum.ru/cpp-... 23714.html
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.09.2014, 18:39
Hsac, самый лучший трюк - вдумчивое чтение хороших книг по C++ и применение полученных знаний на практике
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
12.09.2014, 19:34
Не вижу смысла заменять операции деления, умножения на логические.
1. Современный процессор почти с одинаковой скоростью обрабатывает и те и другие, а так же запросто может выполнять их параллельно если они не зависят друг от друга. Если будет куча идущих подряд AND XOR OR то блок FPU процессора будет просто напросто простаивать.
2. Современный компилятор иногда сам знает как лучше строить код и может сам заменять ваши инструкции на более производительные.
3. Хотите скорости и компактности - пишите на ассемблере.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
12.09.2014, 19:44
Цитата Сообщение от maxillion Посмотреть сообщение
Если будет куча идущих подряд AND XOR OR то блок FPU процессора будет просто напросто простаивать.
Где вы видели эти команды для FPU?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.09.2014, 19:45
Цитата Сообщение от maxillion Посмотреть сообщение
3. Хотите скорости и компактности - пишите на ассемблере....
....после прочтения документации по вашему процессору
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.09.2014, 19:53
Цитата Сообщение от GetHelp Посмотреть сообщение
как ваше условие работает и что делает я лично не понимаю...
Вот тут объяснения как оно работает.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
12.09.2014, 19:54
Цитата Сообщение от ISergey Посмотреть сообщение
Сообщение от maxillion
Если будет куча идущих подряд AND XOR OR то блок FPU процессора будет просто напросто простаивать.
Где вы видели эти команды для FPU?
Дак я же и написал что ПРОСТАИВАТЬ FPU будет, а работать только ALU или как там.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
12.09.2014, 20:43
Цитата Сообщение от maxillion Посмотреть сообщение
3. Хотите скорости и компактности - пишите на ассемблере.
Как бы да но толку мало...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
 
int main()
{
    const int const_1 = 7;
    const int const_2 = 6;
 
    const int const__opt = const_1 - const_2;
 
    int a, b, r;
 
    std::cin >> a >> b;
 
    if (a < b)
        r = const_1;
    else
        r = const_2;
    
    /*Что сгенерирует без опримизаций:
    __asm
    {
        mov eax, a
        mov ecx, b
 
        cmp eax, ecx
        jbe l30
        mov ebx, const_1
        jmp l31
    l30:
        mov ebx, const_2
    l31:
 
        mov r, ebx
    }
    */
 
    // Что по идеи должен будет.. 
 
    __asm
    {
        mov eax, a
        mov ecx, b
 
        xor ebx, ebx
        cmp eax, ecx
        setge bl
        sub ebx, 1
        and ebx, const__opt
        add ebx, const_2
 
 
        mov r, ebx
    }
 
    //что вышло
    /*
 
010012DB  mov         eax,dword ptr [a]  
010012DE  mov         ecx,const_2  
010012E3  cmp         eax,dword ptr [b]  
010012E6  mov         edx,const_1  
010012EB  cmovl       ecx,edx  
010012EE  mov         dword ptr [r],ecx 
 
    */
    std::cout << r << std::endl;
 
    return 0;
 
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
12.09.2014, 21:10
Цитата Сообщение от GetHelp Посмотреть сообщение
if (a / 2) смысл тот же, но понятнее
Угу, понятнее, только проверку на чётность не выполняет Ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
 
{
    int var = 20;
    if (var / 2)
        cout << "Value of the variable var is even." << endl;
    else
        cout << "Value of the variable var is odd." << endl;
 
    var = 21;
    if (var / 2)
        cout << "Value of the variable var is even." << endl;
    else
        cout << "Value of the variable var is odd." << endl;
 
    return 0;
 
}
А мой, который Вам так не понравился, выполняет как миленький:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
 
{
    int var = 20;
    if (var & 1)
        cout << "Value of the variable var is odd." << endl;
    else
        cout << "Value of the variable var is even." << endl;
 
    var = 21;
    if (var & 1)
        cout << "Value of the variable var is odd." << endl;
    else
        cout << "Value of the variable var is even." << endl;
 
    return 0;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2014, 21:10
Помогаю со студенческими работами здесь

А какие есть способы написания кода с параллельным просмотром в браузере?
Типа LiveReload, или по принципу редактора Brackets. подскажите, пожалуйста, все способы, попробуем выбрать лучший :)

скажите какие есть программы для построения блок схем из кода???
скажите какие есть программы для построения блок схем из кода???

Подскажите какие платные есть варианты для встроенного редактора кода?
Необходимо в свое приложение включить редактор кода. Нашел пока два варианта: http://www.qwhale.net/products/editor.htm ...

Быстродействие кода
Всем добрый день! Подскажите , пожалуйста, дельные советы по оптимизации кода, простой текстовый файл на 9 строчек обрабатывается больше 20...

Быстродействие кода на C++
Здравствуйте. Есть 2 тестовых кода: 1 на C++, другой на Python. Код на питоне выполняется быстрее, а в моей будущей программе очень важна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru