Форум программистов, компьютерный форум, киберфорум
Теория программирования
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
6 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 60

В чём разница между макросом и подпрограммой?

07.07.2018, 13:33. Показов 4895. Ответов 6

Студворк — интернет-сервис помощи студентам
Подпрограмма, насколько я понимаю - это блок команд, выполняющий какую-нибудь крупную операцию, при этом он вызывается оттуда, где записан. Про макрос читаю, что это то же самое - тот же блок команд, тоже вызываемый со стороны. В чём тут различие, если оно есть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.07.2018, 13:33
Ответы с готовыми решениями:

Разница между директивой и макросом
В чем разница между директивой и макросом?

В чем разница между [] и * ?
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...

В чём разница между .each() и $.each()
читаю про jquery и там есть .each() и $.each() в чем разница? Где можно прочитать про тонкости jquery? Давайте осмысленные названия...

6
Эксперт функциональных языков программированияЭксперт по математике/физике
4311 / 2103 / 431
Регистрация: 19.07.2009
Сообщений: 3,191
Записей в блоге: 24
07.07.2018, 22:16
Вопрос терминологический. Могут быть разные системы понятий.

В более высокоуровневых языках понятие подпрограммы тесно связано с понятием процедуры, в частности, свойствами подпрограммы являются:
1. наличие имени
2. наличие способа динамического (т.е. в рантайме) вызова.
3. наличие параметров.
4. наличие специальных механизмов возврата (преждевременный return, всякие там throw и т.п.)
от процедур подпрограммы обычно отличаются более бедными механизмами передачи аргументов. А ещё я не знаю систем, где подпрограммы были бы анонимными (п.1).

Макросами в некоторых средах (скажем, С) называются куски кода, которые встраиваются по месту использование макроса во время компиляции (отличие в п.2 предыдущего списка). Также макросы не используют специальные механизмы возврата (п.4). При этом они обладают именем и могут содержать параметры, впрочем, способ передачи аргументов у макросов и подпрограмм отличаются в следствии того, что один из них вызывается статически, а другой динамически.

В других системах макросы и подпрограммы синонимы.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
08.07.2018, 17:18
Лучший ответ Сообщение было отмечено Рауль Вулкан как решение

Решение

Если коротко, то макрос - это подстановка в текст программы при компиляции. При компиляции в каждое место исходника, где употреблен макрос будет вставлена последовательность операторов, что указана в теле определения макроса. Если макрос использован 100 раз, то последовательность операторов будет 100 раз вставлена и 100 раз окажется в откомпилированном коде. А если 100 раз использована подпрограмма, то последовательность операторов ее тела окажется в коде лишь 1 раз. Зато 100 раз будут вставлены в код вызовы этой подпрограммы. Если у подпрограммы нет параметров, то вызов подпрограммы - это одна инструкция процессора. А сама подпрограмма может иметь хоть миллион инструкций.
2
6 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 60
09.07.2018, 08:01  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
Если макрос использован 100 раз, то последовательность операторов будет 100 раз вставлена и 100 раз окажется в откомпилированном коде. А если 100 раз использована подпрограмма, то последовательность операторов ее тела окажется в коде лишь 1 раз. Зато 100 раз будут вставлены в код вызовы этой подпрограммы.
То есть, насколько я понимаю, при использовании макросов программа работает быстрее (ибо нет никаких команд вызова), но занимает больше памяти, а при использовании подпрограмм всё наоборот. Но тогда в каких случаях более оптимальным будет использование макросов, а в каких - подпрограмм, чтобы и скорость была вроде бы не улиточной, и сама программа не шибко перевешивала?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
10.07.2018, 09:39
Цитата Сообщение от Рауль Вулкан Посмотреть сообщение
но занимает больше памяти,
тут стоит сделать акцент что больше памяти занимают инструкции (код) программы, а не её данные.
Вызов подпрограммы требует некоторых накладных расходов на сам вызов, плюс выделение памяти на переменные.

Думаю, использование макросов оправданно когда у нас есть небольшие почти похожие куски кода, которые должны работать достаточно быстро. Тогда и читаемость сохраняется, и производительность не будет сильно страдать.
Вот, например, мне понравился кусок кода из видео кодека X264,
спойлер

Используют макрос выполняющий одномерное целочисленное дискретное косинусное преобразования для выполнения двумерного ДКП. При этом, как видите, точки хода/выхода данных также задаются макросами.
https://github.com/mirror/x264... dct.c#L330
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
    #define DCT8_1D {\
    int s07 = SRC(0) + SRC(7);\
    int s16 = SRC(1) + SRC(6);\
    int s25 = SRC(2) + SRC(5);\
    int s34 = SRC(3) + SRC(4);\
    int a0 = s07 + s34;\
    int a1 = s16 + s25;\
    int a2 = s07 - s34;\
    int a3 = s16 - s25;\
    int d07 = SRC(0) - SRC(7);\
    int d16 = SRC(1) - SRC(6);\
    int d25 = SRC(2) - SRC(5);\
    int d34 = SRC(3) - SRC(4);\
    int a4 = d16 + d25 + (d07 + (d07>>1));\
    int a5 = d07 - d34 - (d25 + (d25>>1));\
    int a6 = d07 + d34 - (d16 + (d16>>1));\
    int a7 = d16 - d25 + (d34 + (d34>>1));\
    DST(0) =  a0 + a1     ;\
    DST(1) =  a4 + (a7>>2);\
    DST(2) =  a2 + (a3>>1);\
    DST(3) =  a5 + (a6>>2);\
    DST(4) =  a0 - a1     ;\
    DST(5) =  a6 - (a5>>2);\
    DST(6) = (a2>>1) - a3 ;\
    DST(7) = (a4>>2) - a7 ;\
}
 
static void sub8x8_dct8( dctcoef dct[64], pixel *pix1, pixel *pix2 )
{
    dctcoef tmp[64];
 
    pixel_sub_wxh( tmp, 8, pix1, FENC_STRIDE, pix2, FDEC_STRIDE );
 
#define SRC(x) tmp[x*8+i]
#define DST(x) tmp[x*8+i]
    for( int i = 0; i < 8; i++ )
        DCT8_1D
#undef SRC
#undef DST
 
#define SRC(x) tmp[i*8+x]
#define DST(x) dct[x*8+i]
    for( int i = 0; i < 8; i++ )
        DCT8_1D
#undef SRC
#undef DST
}
1
6 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 60
10.07.2018, 18:56  [ТС]
Цитата Сообщение от wingblack Посмотреть сообщение
больше памяти занимают инструкции (код) программы, а не её данные.
Ну дык я ведь и говорю об инструкциях. Если 300 раз вызывать подпрограмму, а её код написать только один раз, то вся программа будет весить меньше, чем если мы тот же код впишем везде, где надо вместо вызовов.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
10.07.2018, 21:46
Цитата Сообщение от Рауль Вулкан Посмотреть сообщение
То есть, насколько я понимаю, при использовании макросов программа работает быстрее (ибо нет никаких команд вызова), но занимает больше памяти, а при использовании подпрограмм всё наоборот.
Именно так. Если подпрограмма небольшая в размерах и быстродействие очень критично, то предпочтительнее растыкать ее тело по нужным местам программы макросами. Скомпилированный код станет несколько больше из-за повторений последовательностей операторов, зато результат будет работать быстрее. Поскольку будут опущены машинные инструкции вызова подпрограммы и возврата из нее. Это одна из техник оптимизации кода по быстродействию.
Большие по размерам подпрограммы макросами не оформляют, потому-что ты больше проиграешь на подсосе разбухшего кода в кеш процессора, чем выиграешь. Тут как-бы требуется чувство меры.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2018, 21:46
Помогаю со студенческими работами здесь

В чем разница между ^p и ^13
Заменой сделал строку с ^p и строку с ^13 с Подстановочными знаками. Если поместить курсор на строку с ^13, то курсор станет за знаком...

В чем разница между . и ,
Вот столкнулся с таким вопросом вчем разница между . и , Привер &lt;? echo '&lt;pre&gt;',var_dump($array),'&lt;/pre&gt;'; ?&gt; ...

В чем разница между С и С++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы а в С их нету ?

В чем разница между \n и \r
Здравствуйте. Собственно вопрос в название темы. Объясните, в чем разница между /n и /r?

В чем разница между X x; и X x()?
Корректный ли этот ответ?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru