На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++

Страницы: (117) « Первая ... 88 89 [90] 91 92 ...  116 117  ( Перейти к последнему сообщению )  
> Delphi vs C++ , Часть 1
    Цитата e-moe @
    есть в делфи фор нет

    :no:
      Цитата mo3r @
      Цитата (e-moe @ Вчера, 20:02)
      Цитата
      есть в делфи фор нет

      :no:


      цитаты из хелпа к RAD Studio 2007
      Цитата
      The term generics is a collective noun that describes the set of things in the platform that can be parameterized by type using the new support in .NET 2.0. Generics can refer to generic types, generic methods, or (for Delphi) generic procedures and generic functions.


      ExpandedWrap disabled
        type
          TPair<TKey,TValue>= class   // declares TPair type with two type parameters
         
        private
            FKey: TKey;
            FValue: TValue;
          public
            function GetKey: TKey;
            procedure SetKey(Key: TKey);
            function GetValue: TValue;
            procedure SetValue(Value: TValue);
            property Key: TKey read GetKey write SetKey;
            property Value: TValue read GetValue write SetValue;
          end;
         
        type
          TSIPair = TPair<String,Integer>; // declares instantiated type
          TSSPair = TPair<String,String>; // declares with other data types
          TISPair = TPair<Integer,String>;
            TIIPair = TPair<Integer,Integer>;
            TSXPair = TPair<String,TXMLNode>;
        Цитата wind @
        Вроде как отсутствие возможности отбрасывать неиспользуемый код за сишными кодом давно водится и прочно.
        Сколько использовал компиляторов(штук 20 наверное), что-то не припомню такого. Может у меня руки кривые?

        P.S. компиляторы C/C++ уже давно умеют пихать функции в отдельные сегменты в объектниках. Именно для облегчения отбрасывания неиспользуемых функций.

        P.P.S. библиотеки(*.lib в Win, *.a в Unix) - это просто архив объектных файлов.
          Цитата
          Вроде как отсутствие возможности отбрасывать неиспользуемый код за сишными кодом давно водится и прочно.

          Смотри: на этапе компиляции компилируем ВЕСЬ код. Мало ли, можт ты там синтаксическую ошибку допустил? даже если функция не используется, то она будет обязательно скомпилирована. В добавок - это линковщик определяет, использована ли функция и т.п.. Потом из .obj файлов делаем .exe, и вот уже на этом этапе есть возможность слинковать без неиспользованных функций.
          Линковщик - програмка довольно тупая, поэтому неиспользованные методы просто не будут добавлены. Нужно чётко понимать, что они не попадут в exe файл, хотя и будут скомпилированы.

          Добавлено
          даже если линковщик не догадался выбросить неиспользованную функцию, то это всего лишь увеличит размер .exe файла, (почти) никак не сказавшись на производительности.
          Сообщение отредактировано: Бобёр -
            Цитата trainer @
            Сколько использовал компиляторов(штук 20 наверное), что-то не припомню такого. Может у меня руки кривые?

            Тогда действительно открытие. Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника. Разумеется, в сборку не будут включены вообще ненужные объектные файлы, но и только. Ухищрения вроде компиляции каждой функции в отдельный объектник позволяют избавиться от ненужных включений в бинарнике. А насчёт возможности изымать сегменты из объектного файла у меня есть серьёзные сомнения - развеете?
              Цитата
              А насчёт возможности изымать сегменты из объектного файла у меня есть серьёзные сомнения - развеете?

              Ты не понял. Они оттуда не изымаются, а всего лишь не попадают вообще.
              Вопрос, кстати, интересный, вот, скажем, неиспользованные статические объекты выкинуты не будут. Но это уже детали..
                Цитата wind @
                Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника.
                Ну я смотрю нобелевка уже не за горами. :D

                Делаем простейший эксперимент. берем исходник:
                ExpandedWrap disabled
                  #include <stdio.h>
                  int func(int a, int b, int c, int d) {
                     int result = 0;
                     if( a )
                        result = a^b^c^d;
                     return result;
                  }
                  int main(int argc, char* argv[]) {
                     puts("Hello World");
                     return 0;
                  }
                компилируем, в полученной файле exe ищем эту функцию. Я даже подскажу, как она должна выглядеть:
                ExpandedWrap disabled
                  PUBLIC  ?func@@YIHHHHH@Z                ; func
                  ; Function compile flags: /Ogty
                  ; File c:\programmer\projects\test\test005\main.cpp
                  ;   COMDAT ?func@@YIHHHHH@Z
                  _TEXT   SEGMENT
                  _c$ = 8                         ; size = 4
                  _d$ = 12                        ; size = 4
                  ?func@@YIHHHHH@Z PROC NEAR              ; func, COMDAT
                  ; _a$ = ecx
                  ; _b$ = edx
                   
                  ; 284  :    int result = 0;
                   
                    00000 33 c0        xor     eax, eax
                   
                  ; 285  :    if( a )
                   
                    00002 85 c9        test    ecx, ecx
                    00004 74 0e        je  SHORT $L613
                   
                  ; 286  :       result = a^b^c^d;
                   
                    00006 8b 44 24 08  mov     eax, DWORD PTR _d$[esp-4]
                    0000a 33 ca        xor     ecx, edx
                    0000c 33 4c 24 04  xor     ecx, DWORD PTR _c$[esp-4]
                    00010 33 c8        xor     ecx, eax
                    00012 8b c1        mov     eax, ecx
                  $L613:
                   
                  ; 287  :    return result;
                  ; 288  : }
                   
                    00014 c2 08 00     ret     8
                  ?func@@YIHHHHH@Z ENDP                   ; func
                ищи
                Прикреплённый файлПрикреплённый файлtest005.zip (14.73 Кбайт, скачиваний: 81)
                  Сегменты в объектнике, вообще-то, не для того, чтобы их выбрасывать, а чтобы можно было реорганизовывать данные. Например, код собрать вместе, данные отдельно от кода, неинициированные переменные вообще отбросить, чтобы при запуске место выделить.

                  Не исключаю существования умных линковщиков, которые могут выбросить кусок объектника, если на него нет ссылок. Но первоначально C/C++ разрабатывались, чтобы их можно было использовать со стандартными

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

                  Что касается отбрасывания неиспользуемых функций в Паскале, то это тоже не от хорошей жизни. Ценой совместимости со стандартными средствами разработки в Borland добились возможности создавать программы, помещающиеся в память (поскольку иначе им пришлось бы загружать с собой всю библиотеку). Хотя, если не ошибаюсь, программу можно откомпилировать и в обычный объектник, и тогда это преимущество исчезает.

                  Цитата trainer @
                  в полученной файле exe ищем эту функцию
                  Насколько я вижу - присутствует, притом в том же сегменте, что и main.

                  Так что в библиотеках лучше функции размещать в отдельных файлах. В своих программах смысла делить файлы не имеет.


                  Да в Паскале циклы не такие удобные, как в C. В Алголе они были погибче.
                    Цитата amk @
                    Да в Паскале циклы не такие удобные, как в C. В Алголе они были погибче.

                    Если бы еще сравнить с лисповским loop :)
                      Цитата amk @
                      Насколько я вижу - присутствует, притом в том же сегменте, что и main.
                      где? назови адрес в файле test005.exe

                      Добавлено
                      Цитата amk @
                      Не исключаю существования умных линковщиков, которые могут выбросить кусок объектника, если на него нет ссылок.
                      Уже прогресс. Еще немного, и выяснится, что они сплошь и рядом умные. :D

                      Цитата amk @
                      Но первоначально C/C++ разрабатывались, чтобы их можно было использовать со стандартными
                      Это что за зверь такой "стандартный линковщик"? В каком стандарте регламентировано его поведение?

                      Добавлено
                      Цитата amk @
                      Сегменты в объектнике, вообще-то, не для того, чтобы их выбрасывать, а чтобы можно было реорганизовывать данные. Например, код собрать вместе, данные отдельно от кода, неинициированные переменные вообще отбросить, чтобы при запуске место выделить.
                      Ты уж определись, то ли "не для того, чтобы их выбрасывать", то ли "неинициированные переменные вообще отбросить" :D
                        Цитата
                        Насколько я вижу - присутствует, притом в том же сегменте, что и main.

                        дык в объектнике он должен быть, а в .exe - я не нашёл, можт плохо искал?
                        ещё раз - объектник - это не то, что будет запущено пользователем.
                        похоже, налицо полное непонимание принципов работы компилятора-линковщика :(

                        Добавлено
                        Об "умных" линковщиках :)
                        сейчас "умный" линковщик умеет совсем не это :).
                        умный линковщик сейчас умеет, например, кросс-модульные inline подстановки, и ещё кучу всего, например, в VS это делается опцией /GL, в линкере /LTCG

                        Цитата

                        /GL
                        With information on all modules, the compiler can:
                        1. Optimize the use of registers across function boundaries.
                        2. Do a better job of tracking modifications to global data, allowing a reduction in the number of loads and stores.
                        3. Do a better job of tracking the possible set of items modified by a pointer dereference, reducing the numbers of loads and stores.
                        4.Inline a function in a module even when the function is defined in another module.

                        /LTCG:
                        When /LTCG is used with either /Og, /O1, /O2, or /Ox, the following optimizations are performed:
                        1. Cross-module inlining
                        2. Interprocedural register allocation (64-bit operating systems only)
                        3. Custom calling convention (x86 only)
                        4. Small TLS displacement (x86 only)
                        5. Stack double alignment (x86 only)
                        6. Improved memory disambiguation (better interference information for global variables and input parameters)

                        Сообщение отредактировано: Бобёр -
                          Цитата e-moe @
                          Фо фрипаскале уже зарождаются, есть в делфи фор нет и будет в следующих версиях делфи фор вин32.

                          Ну зарождается - это еще не шаблоны. Си++ные появились 10 лет назад а до сих пор совершенствуются 8-) и потом.... шаблоны, это как верно заметил mo3r - это не метаязык уже а не просто параметризация классов :)
                            Цитата
                            это не метаязык уже а не просто параметризация классов :)

                            так и не понял, что же тогда шаблоны, если они не-.. не.. :)
                            Сообщение отредактировано: Бобёр -
                              Цитата trainer @
                              где? назови адрес в файле test005.exe
                              действительно текст (в смысле код) прямо с функции main и начинается.

                              Поясняю о чем я говорил
                              Слово "стандартный" это иногда не только "соответствующий стандарту", а "повсеместно использующийся" (или в данном случае использовавшийся - на момент создания языка C++)
                              С самого появления языка C (без ++) под неинициированные переменные память отводилась при старте программы, тогда же обнулялась.

                              Таким образом, единственное пришедшее мне на ум преимущество Паскаля перед C++ уже не является преимуществом, поскольку нынешние линковщики без проблем выбрасывают избыточный код (даже без специальной разметки объектного файла).

                              PS: Надо на своих линковщиках этот пример попробовать
                                Цитата wind @
                                Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника.

                                Ухты.
                                интересно чтоже такое "Eliminate Unreferenced Data" у моего линкеера.. :rolleyes:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (117) « Первая ... 88 89 [90] 91 92 ...  116 117
                                Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++



                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1554 ]   [ 15 queries used ]   [ Generated: 29.07.25, 05:06 GMT ]