Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> inline и define - выбор 
:(
    Опции темы
Любитель
Дата 24.7.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
Суровая правда жизни

Пруфлинк?

Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
даже борланд 

 smile

Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
А это тут то причем???  

При том, что развернув рекурсию в цикл, полученное можно заинлайнить.


--------------------
PM MAIL ICQ Skype   Вверх
Любитель
Дата 24.7.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Насчёт рекурсии - проверено на VC++ 2005, на VC++ 2008 тоже, думаю, сработает.

Исходный код:
Код

#include <stdio.h>

#pragma inline_recursion(on)

int __forceinline add(int a, int b)
{
    if (b == 0)
        return a;
    else
        return add(1 + a, b - 1);
}

int main()
{
    printf("%i", add(5, 7));
}


Получаем:
Код

push        0Ch     ; типа фтопку нашу функцию :)
push        offset string "%i"
call           dword ptr [__imp__printf ] 
add          esp,8 
xor           eax,eax 
ret     


Это сообщение отредактировал(а) Любитель - 24.7.2008, 17:44


--------------------
PM MAIL ICQ Skype   Вверх
varnie
Дата 24.7.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: нет
Всего: 0



Цитата(varnie)

предпочитайте const и inline использованию #define

Цитата(DRUID3 @  24.7.2008,  19:40 Найти цитируемый пост)

угу... А еще надо хорошо учиться и слушать папу и маму... smile  

я написал это не для того, чтобы пустые фразы ниже увидеть, а к тому, что если кому-то это интересно, то как минимум можно обратиться к материалу из книги, которую я указал для уточнения.


Это сообщение отредактировал(а) varnie - 24.7.2008, 18:21
PM MAIL   Вверх
Lazin
Дата 24.7.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(DRUID3 @ 24.7.2008,  16:40)
Цитата(Lazin @  24.7.2008,  14:30 Найти цитируемый пост)
а стек для чего?

А подстановкой мы что экономим!!!??? smile 

какой подстановкой? ты о чем?
локальные переменные размещаются в стеке, всегда... встроена функция, или нет, это не важно
PM MAIL Skype GTalk   Вверх
phprus
Дата 24.7.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
вон, смотрите, даже борланд по определению не сделает inline рекурсивную функцию.

C++ компилятор от борланда на столько крив и глючен, что не достоен называться компилятором.Он отстал от жизни лет на 20.
Возьмите как образец G++, компилятор от Intel или M$ VS.


Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
Отекда у нас уже пошла речь о разложении простой рекурсии?

Хвостовая рекурсия раскладывается в цикл элементарно. Такие оптимизации уже давно не редкость.

Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
Суровая правда жизни smile ...

Это именно что ерунда. Сколько пользовался !нормальными! компиляторами никогда такого не замечал в релиз-сборках проектов.

Цитата(DRUID3 @  24.7.2008,  16:40 Найти цитируемый пост)
А подстановкой мы что экономим!!!??? smile 

Как я понимаю имеется ввиду inline-подстановка тела функции?
Если я прав, то в сад. Подстановкой мы экономим вызов функции, те переход на удаленный участок кода, которого скорее всего нет в кеше процессора и тд... А память в стеке выделяется мгновенно, ибо это всего-лишь изменение значения указателя на вершину стека и ВСЕ. Кроме того стек почти гарантированно лежит в кэше процессора, а это еще ускорит работу с используемой частью стека.
PM MAIL WWW ICQ   Вверх
Riply
Дата 25.7.2008, 07:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



"Ох, не легкая это работа - из болота тащить бегемота" (с) 
Спасибо всем тащившим  smile

P.S.
 Я много вынесла из этой ветки. 

PM MAIL   Вверх
W4FhLF
Дата 26.7.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Хоть уже и не актуально, но раз уж обещал дизассемблировать примеры, то в выложенном на первой странице exe компилятор действительно проигнорировал inline, на уровне маш. кода осуществялется вызов отдельной процедуры. 

Извиняюсь за задержку, запамятовал smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Riply
Дата 26.7.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(W4FhLF @  26.7.2008,  14:34 Найти цитируемый пост)
Хоть уже и не актуально


"не актуально" становится только тогда, когда участники и автор топика
полностью разобрались в данном воросе и "постигли сущность сущностей " smile
Не знаю как другие, но я до этого состояния в данной теме еще не дошла
Даже не посмотрела что за "мрак хаоса описанный в книжонке Саттера..."  (с) DRUID3
smile

Цитата(W4FhLF @  26.7.2008,  14:34 Найти цитируемый пост)
но раз уж обещал дизассемблировать примеры, то в выложенном на первой странице exe компилятор действительно проигнорировал inline, на уровне маш. кода осуществялется вызов отдельной процедуры


Спасибо большое. Теперь предположения, превратились в уверенность smile



Это сообщение отредактировал(а) Riply - 26.7.2008, 22:39
PM MAIL   Вверх
Supersedes
Дата 29.7.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.7.2008

Репутация: нет
Всего: нет



Riply, а с каким компилятором ты вообще работаешь?

Это сообщение отредактировал(а) Supersedes - 29.7.2008, 12:36
PM MAIL ICQ   Вверх
Riply
Дата 29.7.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(Supersedes @  29.7.2008,  12:26 Найти цитируемый пост)
Riply, а с каким компилятором ты вообще работаешь?


В данном случае, все происходило под Builder`ом.
PM MAIL   Вверх
xvr
Дата 29.7.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Riply @ 29.7.2008,  19:43)
Цитата(Supersedes @  29.7.2008,  12:26 Найти цитируемый пост)
Riply, а с каким компилятором ты вообще работаешь?


В данном случае, все происходило под Builder`ом.

Кстати, о птичках - откомпилировал тест под Билдером (6.0)
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

struct UNICODE_STRING {
 ULONG MaximumLength;
 ULONG Length;
};

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
 int v;
 UNICODE_STRING us;
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

__inline int Us_SetLength(UNICODE_STRING* pUs, const ULONG aLength)
{
  if (pUs->MaximumLength >= aLength)
   {
     pUs->Length = aLength;
     return 0;
   };
  return 1;
};

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 v=Us_SetLength(&us,10);
}
//---------------------------------------------------------------------------
Поставил режим 'Release', все заинлайнилось:

Код

 ;    
 ;    {
 ;     v=Us_SetLength(&us,10);
 ;    
?live16385@32: ; EBX = $delflag
    mov eax,dword ptr [ebp-4]
    add eax,756
    cmp dword ptr [eax],10
    jb        short @3
    mov dword ptr [eax+4],10
    xor edx,edx
    jmp short @4
@3:
    mov edx,1
@4:
    mov eax,dword ptr [ebp-4]
    mov dword ptr [eax+752],edx
 ;    
 ;    }
Вывод - хотите производительности, включайте оптимизации и будет вам счастье  smile 
PM MAIL   Вверх
Riply
Дата 30.7.2008, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(xvr @  29.7.2008,  22:41 Найти цитируемый пост)
Поставил режим 'Release', все заинлайнилось


Можете себе представить какое мнение у меня сложилось о способностях Builder`а,
после того как он отказался инлайнить такую простую функцию.
Вам удалось чуть-чуть его (это мнение) поднять . Builder должен быть Вам благодарен smile
P.S.
 И я тоже благодарна smile

PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.