
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.220] |
![]() |
|
Страницы: (117) « Первая ... 88 89 [90] 91 92 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#1337
,
|
|
|
Цитата mo3r @ Цитата (e-moe @ Вчера, 20:02) Цитата есть в делфи фор нет ![]() цитаты из хелпа к 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. ![]() ![]() 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>; |
Сообщ.
#1338
,
|
|
|
Цитата wind @ Сколько использовал компиляторов(штук 20 наверное), что-то не припомню такого. Может у меня руки кривые?Вроде как отсутствие возможности отбрасывать неиспользуемый код за сишными кодом давно водится и прочно. P.S. компиляторы C/C++ уже давно умеют пихать функции в отдельные сегменты в объектниках. Именно для облегчения отбрасывания неиспользуемых функций. P.P.S. библиотеки(*.lib в Win, *.a в Unix) - это просто архив объектных файлов. |
Сообщ.
#1339
,
|
|
|
Цитата Вроде как отсутствие возможности отбрасывать неиспользуемый код за сишными кодом давно водится и прочно. Смотри: на этапе компиляции компилируем ВЕСЬ код. Мало ли, можт ты там синтаксическую ошибку допустил? даже если функция не используется, то она будет обязательно скомпилирована. В добавок - это линковщик определяет, использована ли функция и т.п.. Потом из .obj файлов делаем .exe, и вот уже на этом этапе есть возможность слинковать без неиспользованных функций. Линковщик - програмка довольно тупая, поэтому неиспользованные методы просто не будут добавлены. Нужно чётко понимать, что они не попадут в exe файл, хотя и будут скомпилированы. Добавлено даже если линковщик не догадался выбросить неиспользованную функцию, то это всего лишь увеличит размер .exe файла, (почти) никак не сказавшись на производительности. |
![]() |
Сообщ.
#1340
,
|
|
Цитата trainer @ Сколько использовал компиляторов(штук 20 наверное), что-то не припомню такого. Может у меня руки кривые? Тогда действительно открытие. Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника. Разумеется, в сборку не будут включены вообще ненужные объектные файлы, но и только. Ухищрения вроде компиляции каждой функции в отдельный объектник позволяют избавиться от ненужных включений в бинарнике. А насчёт возможности изымать сегменты из объектного файла у меня есть серьёзные сомнения - развеете? |
Сообщ.
#1341
,
|
|
|
Цитата А насчёт возможности изымать сегменты из объектного файла у меня есть серьёзные сомнения - развеете? Ты не понял. Они оттуда не изымаются, а всего лишь не попадают вообще. Вопрос, кстати, интересный, вот, скажем, неиспользованные статические объекты выкинуты не будут. Но это уже детали.. |
Сообщ.
#1342
,
|
|
|
Цитата wind @ Ну я смотрю нобелевка уже не за горами. Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника. ![]() Делаем простейший эксперимент. берем исходник: ![]() ![]() #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; } ![]() ![]() 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 Прикреплённый файл ![]() |
Сообщ.
#1343
,
|
|
|
Сегменты в объектнике, вообще-то, не для того, чтобы их выбрасывать, а чтобы можно было реорганизовывать данные. Например, код собрать вместе, данные отдельно от кода, неинициированные переменные вообще отбросить, чтобы при запуске место выделить.
Не исключаю существования умных линковщиков, которые могут выбросить кусок объектника, если на него нет ссылок. Но первоначально C/C++ разрабатывались, чтобы их можно было использовать со стандартными На быстродействие включение лишних функций почти не влияет. Только загружается чуть дольше и памяти остается меньше. Что касается отбрасывания неиспользуемых функций в Паскале, то это тоже не от хорошей жизни. Ценой совместимости со стандартными средствами разработки в Borland добились возможности создавать программы, помещающиеся в память (поскольку иначе им пришлось бы загружать с собой всю библиотеку). Хотя, если не ошибаюсь, программу можно откомпилировать и в обычный объектник, и тогда это преимущество исчезает. Цитата trainer @ Насколько я вижу - присутствует, притом в том же сегменте, что и main.в полученной файле exe ищем эту функцию Так что в библиотеках лучше функции размещать в отдельных файлах. В своих программах смысла делить файлы не имеет. Да в Паскале циклы не такие удобные, как в C. В Алголе они были погибче. |
Сообщ.
#1344
,
|
|
|
Цитата amk @ Да в Паскале циклы не такие удобные, как в C. В Алголе они были погибче. Если бы еще сравнить с лисповским loop ![]() |
Сообщ.
#1345
,
|
|
|
Цитата amk @ где? назови адрес в файле test005.exe Насколько я вижу - присутствует, притом в том же сегменте, что и main. Добавлено Цитата amk @ Уже прогресс. Еще немного, и выяснится, что они сплошь и рядом умные. Не исключаю существования умных линковщиков, которые могут выбросить кусок объектника, если на него нет ссылок. ![]() Цитата amk @ Это что за зверь такой "стандартный линковщик"? В каком стандарте регламентировано его поведение? Но первоначально C/C++ разрабатывались, чтобы их можно было использовать со стандартными Добавлено Цитата amk @ Ты уж определись, то ли "не для того, чтобы их выбрасывать", то ли "неинициированные переменные вообще отбросить" Сегменты в объектнике, вообще-то, не для того, чтобы их выбрасывать, а чтобы можно было реорганизовывать данные. Например, код собрать вместе, данные отдельно от кода, неинициированные переменные вообще отбросить, чтобы при запуске место выделить. ![]() |
Сообщ.
#1346
,
|
|
|
Цитата Насколько я вижу - присутствует, притом в том же сегменте, что и 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) |
Сообщ.
#1347
,
|
|
|
Цитата e-moe @ Фо фрипаскале уже зарождаются, есть в делфи фор нет и будет в следующих версиях делфи фор вин32. Ну зарождается - это еще не шаблоны. Си++ные появились 10 лет назад а до сих пор совершенствуются ![]() ![]() |
Сообщ.
#1348
,
|
|
|
Цитата это не метаязык уже а не просто параметризация классов ![]() так и не понял, что же тогда шаблоны, если они не-.. не.. ![]() |
Сообщ.
#1349
,
|
|
|
Цитата trainer @ действительно текст (в смысле код) прямо с функции main и начинается.где? назови адрес в файле test005.exe Поясняю о чем я говорил Слово "стандартный" это иногда не только "соответствующий стандарту", а "повсеместно использующийся" (или в данном случае использовавшийся - на момент создания языка C++) С самого появления языка C (без ++) под неинициированные переменные память отводилась при старте программы, тогда же обнулялась. Таким образом, единственное пришедшее мне на ум преимущество Паскаля перед C++ уже не является преимуществом, поскольку нынешние линковщики без проблем выбрасывают избыточный код (даже без специальной разметки объектного файла). PS: Надо на своих линковщиках этот пример попробовать |
Сообщ.
#1350
,
|
|
|
Цитата wind @ Конструктивные, так сказать, особенности сиплюсовых компиляторов не позволяют вообще изымать неиспользуемый код из бинарника. Ухты. интересно чтоже такое "Eliminate Unreferenced Data" у моего линкеера.. ![]() |