2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение11.02.2014, 00:55 
Заслуженный участник
Аватара пользователя


06/10/08
6422
inline есть в C99

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение11.02.2014, 00:58 
Заслуженный участник
Аватара пользователя


28/07/09
1238
Joker_vD
Joker_vD в сообщении #824995 писал(а):
И пускай там уже компилятор играет с регистрами и инлайнит функции, все равно у него это выходит куда как лучше.


Я вот тут почитал для примера ассемблерный листинг такой программы. Программа из моего первого сообщения, один из вариантов (A,B,C,X,Y).
Используется синтаксис C
#include <stdio.h>

main()
{
    int FC, SP, TB; FC=SP=TB=0;
    int c=getchar();
    if(c==' ' || c=='\t')
    {
        FC=123;
        if(c==' ') SP=234; else TB=345;
    }
    printf("%d %d %d", !!FC, !!SP, !!TB);
}
 

(FC = format character, эти странные числа 123, 234 и 345 - это чтобы удобнее было листинг читать :roll: )

Так вот, компилятор хоть и сделал всё довольно лаконично (я не сразу разобрался в этих всех джампах), но всё-таки двойной полностью идентичный вызов movl $123, %eax присутствует. Хотя, возможно, конкретно в этом случае повторить команду в двух разных местах экономнее, чем делать из двух мест джамп в одно место с этим присваиванием.
И я всё равно считаю, что команды можно написать проще и быстрее.

-- Вт фев 11, 2014 01:59:48 --

Xaositect в сообщении #825135 писал(а):
inline есть в C99

Спасибо, буду теперь использовать:)

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение11.02.2014, 01:10 
Аватара пользователя


28/01/12
467
Legioner93 в сообщении #825134 писал(а):
По-моему inline функций в C нет.
Это откуда, что нет в обычном С деклараций - inline / static inline ?

upd. Аааа, уже ответили. Ок.

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение11.02.2014, 07:24 
Заслуженный участник


09/09/10
3729
Legioner93 в сообщении #825136 писал(а):
Так вот, компилятор хоть и сделал всё довольно лаконично (я не сразу разобрался в этих всех джампах), но всё-таки двойной полностью идентичный вызов movl $123, %eax присутствует. Хотя, возможно, конкретно в этом случае повторить команду в двух разных местах экономнее, чем делать из двух мест джамп в одно место с этим присваиванием.

Переход, особенно условный, дороже простого присваивания. Иногда сильно — слышали про такую технику оптимизации, как развертывание циклов?
Ну а вообще — замените FC=123; на что-нибудь подлиннее, и гляньте результат.

Слово inline есть в C99, но в любом случае, компилятор решает сам, делать ему инлайн или нет. Это ключевое слово — лишь подсказка.

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение12.02.2014, 02:28 


29/11/10
107
во-первых не надо бояться использовать goto. Этот оператор и существует как раз для подобных ситуаций. Просто не стоит его лепить где попало, а тщательно взвесить решение об использовании. Во-вторых ответ уже дан не однажды.
Используется синтаксис C
if (X) B;
else if (Y) C;
else    /*сюда мы попадем только если !(X ^ Y) и выйдем из функции не выполняя ничего*/
    return 0;
A; /*выполнится при условии (X ^ Y)*/
return 0;
 

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение12.02.2014, 11:13 


05/09/12
2587
Красивый конечно вариант - спрятать goto end за return-ами. Только придется функцию для этого создавать и вызывать. А что там - это же делает код более понятным, разбивает на функциональные блоки, короткие и легко формализуемые. А то, что при этом по call conventions компилятором генерируется стопка команд по сохранению контекста в стеке и в отдельных случаях дополнительные страховочные ненужные команды, а потом по return все это торжественно восстанавливается, мы оставляем за кадром нашего внешне красивого кода на нашем языке. Но тут уже выбираем в каждом конкретном случае свои приоритеты.

ЗЫ из множества холиваров на эту тему могу предложить небольшую статейку с хабра, в которой автор рассматривает применение goto в чистом С применительно к микроконтроллерам

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение12.02.2014, 13:03 


24/05/09

2054
Goto переводится как "да пошел ты!"? Некультурно, однако... :D

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение12.02.2014, 19:54 
Заслуженный участник


09/09/10
3729
_Ivana в сообщении #825523 писал(а):
А то, что при этом по call conventions компилятором генерируется стопка команд по сохранению контекста в стеке и в отдельных случаях дополнительные страховочные ненужные команды, а потом по return все это торжественно восстанавливается, мы оставляем за кадром нашего внешне красивого кода на нашем языке.

Ну, это зависит. Если вы объявили эти функции имеющими внешнюю линковку, то компилятор обязан сгенерировать настоящие функции в объектном файле... но он не обязан их использовать. Он все равно может съинлайнить все в один большой кусок кода, без всяких CALL и RET и прочего. А потом линкер еще может вычистить весь "мертвый" код, и вуаля — машинный код практически тот же, что и в случае "написать одну большую лапшу с goto".

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение12.02.2014, 19:58 
Админ форума
Аватара пользователя


19/03/10
8952
Alexu007 в сообщении #825566 писал(а):
Goto переводится как "да пошел ты!"? Некультурно, однако... :D
 !  Alexu007, замечание за бессодержательное сообщение.

 Профиль  
                  
 
 Re: Как обойтись без GOTO, но максимально красиво соблюсти D.R.Y
Сообщение18.02.2014, 09:35 
Заслуженный участник


02/08/11
7013
Joker_vD в сообщении #825665 писал(а):
Если вы объявили эти функции имеющими внешнюю линковку

Это лишнее, они же в одном месте используются. В любом случае можно объявить их inline и успокоиться. Собственно, слово inline для этого и существует - на результирующий машинный код оно, вообще говоря, не влияет, но приносит душевное спокойствие тем, кто боится накладных расходов на вызов функции.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group