Собственно вопрос в теме. Никогда ранее не интересовался дефайнами, теперь хочу освоить.
Можно пару простых и пару сложных примеров ?
Больше интересует вопрос по скорости работы, есть ли смысл работать с дефайнами ?
В справке не нашёл примера создания функции, то же хотелось бы увидеть пример.
#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:
#define SEARCH_FAILED -1double array[];
if(ArrayMaximum(array) == SEARCH_FAILED)
printf("Не удалось найти максимум в массиве. Проверьте содержимое массива.");
Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться.
в принципе-то для ф-й это наверное не так актуально, потмоу что ф-ии и так быстро и легко вызываются :)
Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки
int n = 0;
void f()
{
n++;
}
n++; // будет быстрее функции
#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:
Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться.
дефайн плох тем, что не имеет типа, рекомендуется использовать константы
Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки
Не будет.
Код:
double n = 0;
long niteration = 10000000000;
voidOnStart()
{
datetime from = TimeCurrent();
for( long i = 0; i < niteration; i++ ){
n++;
}
datetime to = TimeCurrent();
Print("time for n++:", (long)(to-from), " n=", n );
from = to;
for( long i = 0; i < niteration; i++ ){
f();
}
to = TimeCurrent();
Print("time for f():", (long)(to-from), " n=", n );
}
//+------------------------------------------------------------------+void f()
{
n++;
}
Результат:
2017.07.27 20:53:10.788callf (MXI-9.17,M15)time for n++:27 n=10000000000.0
2017.07.27 20:53:37.014callf (MXI-9.17,M15)time for f():26 n=20000000000.0
Код:
long n = 0;
long niteration = 10000000000;
voidOnStart()
{
datetime from = TimeCurrent();
for( long i = 0; i < niteration; i++ ){
n++;
}
datetime to = TimeCurrent();
Print("time for n++:", (long)(to-from), " n=", n );
from = to;
for( long i = 0; i < niteration; i++ ){
f();
}
to = TimeCurrent();
Print("time for f():", (long)(to-from), " n=", n );
}
//+------------------------------------------------------------------+void f()
{
n++;
}
Результат:
2017.07.27 20:55:10.144callf (MXI-9.17,M15)time for n++:0 n=10000000000
2017.07.27 20:55:10.144callf (MXI-9.17,M15)time for f():0 n=20000000000
Alexey Volchanskiy: Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически
Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.
Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровне '#define DEBUG' не больше.
Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.
Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровнеляции, я часто используютакже на уровне условной '#define DEBUG' не больше.
Собственно вопрос в теме. Никогда ранее не интересовался дефайнами, теперь хочу освоить.
Можно пару простых и пару сложных примеров ?
Больше интересует вопрос по скорости работы, есть ли смысл работать с дефайнами ?
В справке не нашёл примера создания функции, то же хотелось бы увидеть пример.
#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:
Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться.
Спасибо!
А как сделать функцию ?
например то что сейчас я кручу
никак не получается, сообразить не могу...То, что Вы делаете, отличный способ убиться. Ни в коем случае так не пишите.
https://www.mql5.com/ru/docs/basis/preprosessor/constant - объяснение проще не бывает и примеры есть - даже я понял.
http://www.codenet.ru/progr/cpp/Macros.php
return там не надо
в принципе-то для ф-й это наверное не так актуально, потмоу что ф-ии и так быстро и легко вызываются :)
Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки
#define это команда препроцессору компилятора, который перед компиляцией заменяет одну запись другой. Следовательно на производительности это никак не сказывается, т.к. все расчеты происходят до компиляции. Пример, пусть Вам нужно будет найти максимум массива с помощью ArrayMaximum. Если максимум не найден функция вернет -1. Эту константу можно заменить на более выразительное:
Надо однако понимать, что #define - это наследство от старых языков программирования. Сейчас использование #define надо избегать, или по крайней мере использовать очень ограничено, на уровне простых подстановок. Поэтому не пытайтесь учиться тому, от чего уже в цивилизованном мире программирования давно стараются отмежеваться.
дефайн плох тем, что не имеет типа, рекомендуется использовать константы
**
Замечу, у каждой функции есть пролог и эпилог, то есть даже такая ф-я будет медленнее чистого кода. Я не призываю заменять функции макросами ))) просто для справки
Не будет.
Код:
Результат:
2017.07.27 20:53:10.788 callf (MXI-9.17,M15) time for n++:27 n=10000000000.0
2017.07.27 20:53:37.014 callf (MXI-9.17,M15) time for f():26 n=20000000000.0
Код:
Результат:
2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for n++:0 n=10000000000
2017.07.27 20:55:10.144 callf (MXI-9.17,M15) time for f():0 n=20000000000
Ренат говорит, что простые маленькие функции компилятор инлайнит. Директивы #inlain в языке нет, он делает это автоматически
Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.
Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровне '#define DEBUG' не больше.
Инлайнит он не подетски. И функция не обязательно должна быть простой и маленькой что бы быть заинлайненой.
Короче, попытки обыграть компьютер на его поле приводят к неизбежному проигрышу. #define штука опасная, не даром от нее отказались в современных ЯП. Если она и осталась то на уровнеляции, я часто используютакже на уровне условной '#define DEBUG' не больше.
А также на уровне условной компиляции
**