
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.129] |
![]() |
|
Страницы: (29) « Первая ... 3 4 [5] 6 7 ... 28 29 ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
В принципе, можно компилить и из плюсов с -fno-rtti и -fno-exceptions. Но! Внимание, вопрос: в чем тогда смысл пользования плюсами? Чтобы тормозило? _Ядро_? Чтобы понты с шаблонами и классами были? А нафуа? Нам ездить как бы надо, а преумножение сущностей, называемых шашечками, процессу езды не помогает.
Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам. Поэтому, хотя шаблоны, равно как использование Common Lisp, коему нет равных в этом деле, позволяют расставить пальцы шире некуда, для ядра ОС вполне достаточно тех средств метапрограммирования (написание на C -- тоже метапрограммирование в известном смысле, приставку "мета-" убирать позволительно лишь в случае лабания напрямую бинарника), которые предоставляет ISO C и его препроцессор. Я не могу понять, почему некоторым людям недостаточно вполне достаточных средств. |
Сообщ.
#62
,
|
|
|
Цитата the_Shadow @ Цитата Странно. А почему я могу писать, например, консольные порграммы безо всяких MFC? У меня компилятор неправильный? Хе-хе... Не про то речь. Возьми какой-нибудь helloworld ![]() Цитата Исполнимый файл? Я тебе и без просмотра скажу. У него RTL меньше. Да и оптимизацию надо смотреть. А я-то как раз вот об этом... Если вспомнить наш с Flex'ом флейм про Visual... ![]() Я, кстати, про то же и рассказываю... ![]() Цитата Ну помимо всего прочего, размер зависит и от способности компилятора к оптимизации. Я, помнится, в алгоритмах выкладывал дизассемблированную функцию перемножения векторов. Там и Intel С++ и Metrowerks развернули циклы на пару килобайт кода. И за счет этого обставили паскаль по быстродействию раза в 3 и сравнялись с оптимизированной вручную на ассемблере. А если не разворачивать - будет сотня байт. ![]() Во-во-во... 5 (пять!) баллов. Вот по этой-то причине до разного рода споров (в т.ч. и х?ли-варных) я и предлагаю по-смотреть код с опцией -S. При разных режимах оптимизации. Вот тогда мы более-менее поймём что же там на самом-то деле происходит. А не будем огульно говорить что Линукс тормозит по причине того, что там с gcc всё скомпилировано... ![]() Взять, говоришь, и посмотреть? Пожалуйте. Возьми простейший исходник: ![]() ![]() #include <stdio.h> int main() { puts("Hello world"); return 0; } Скомпили его под виндой с опциями /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF. Под Lin - с опциями -O4 -S. Сравни результаты. Добавлено Если пока нет возможности запуситить, то результаты такие: helloworld.cod: ![]() ![]() TITLE helloworld.c .386P include listing.inc if @Version gt 510 .model FLAT else _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS _DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS _BSS SEGMENT DWORD USE32 PUBLIC 'BSS' _BSS ENDS _TLS SEGMENT DWORD USE32 PUBLIC 'TLS' _TLS ENDS FLAT GROUP _DATA, CONST, _BSS ASSUME CS: FLAT, DS: FLAT, SS: FLAT endif PUBLIC _main EXTRN __imp__puts:NEAR _DATA SEGMENT $SG827 DB 'Hello world', 00H _DATA ENDS _TEXT SEGMENT _main PROC NEAR ; 5 : puts("Hello world"); 00000 68 00 00 00 00 push OFFSET FLAT:$SG827 00005 ff 15 00 00 00 00 call DWORD PTR __imp__puts 0000b 83 c4 04 add esp, 4 ; 6 : return 0; 0000e 33 c0 xor eax, eax ; 7 : } 00010 c3 ret 0 _main ENDP _TEXT ENDS END helloworld.S: ![]() ![]() .file "helloworld.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "Hello world" .text .p2align 2,,3 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp subl $28, %esp pushl $.LC0 call puts xorl %eax, %eax leave ret .size main, .-main .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4.3 20041212" Размер исполняемого файла под винды: 4096 байт. Размер исполняемого файла под линух: 4718 байт. Что я делаю не так? ![]() Добавлено Цитата Ho Im @ Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам. В общем смысле - да. Применительно к С++ речь обычно идет об обобщенном программировании. |
Сообщ.
#63
,
|
|
|
Вот поэтому плюсы я записываю в более "прикладную" область, где задача состоит в "что-то посчитать", и сделать это правильно в первую очередь, а не "пообщаться с ковриком для мышки". Мону Лизу в микроскоп обычно не разглядывают, равно как деление клетки не наблюдают невооруженным глазом.
Вот так и здесь, задаче нужен свой инструмент. Как для рассматривания одних произведений исскуства нужен невооруженный глаз, для других микроскоп, для третьих -- анаглифические очки, а для четвертых -- замочная скважина. |
Сообщ.
#64
,
|
|
|
Цитата Ho Im @ Вот поэтому плюсы я записываю в более "прикладную" область, где задача состоит в "что-то посчитать", и сделать это правильно в первую очередь, а не "пообщаться с ковриком для мышки". Мону Лизу в микроскоп обычно не разглядывают, равно как деление клетки не наблюдают невооруженным глазом. Опять же, дело не в этом. Ну, вот, к примеру, возьмем C-шный алгоритм сортировки (qsort). Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа? |
Сообщ.
#65
,
|
|
|
Цитата Слушай, если плотник сколотил кособокий дом со щелями - это, наверное, молоток и топор виноваты? Слабая аналогия. Цитата Убери из настроек линкера ненужные библиотеки импорта (которые туда добавляются при создании проекта "по умолчанию"), и таблица импорта не будет такой пухлой. Нет. Лучше посмотри на lcc. Почему в "стандартном" Visual не так? Цитата Какое имеет отношение RTTI к шаблонам? Вообще-то я имею ввиду первоначальное высказывание, с которого "покатился" спор. Цитата Это, конечно, не совсем правильное сравнение, но, если совсем упрощенно, то шаблон - это сильно улучшенная версия макроса. Сильно упрощённо, на мой взгляд. По причине того, что: Цитата Но, в отличии от макроса, который "исчезает" после обработки кода препроцессором, шаблон существет на этапе компиляции, что и составляет одно из основных его отличий от макроопределения. Другое отличие - шаблон может по-разному "раскрываться" в зависимости от того, с какими параметрами его инстанцируют. Flex, вот обрати внимание на то, что я написал выше -- для реализации этих конструкций нужен только ли компилятор? И никакой поддержки в части библиотек? |
Сообщ.
#66
,
|
|
|
Цитата the_Shadow @ А не будем огульно говорить что Линукс тормозит по причине того, что там с gcc всё скомпилировано... ![]() В gcc производительность частично принесена в жертву переносимости. Он и в самом деле компилирует более медленный код по сравнению с icc. Это факт. Цитата Flex Ferrum @ Размер исполняемого файла под линух: 4718 байт. Что я делаю не так? ![]() Ты не делаешь strip ![]() ![]() |
Сообщ.
#67
,
|
|
|
Цитата Flex Ferrum @ Скомпили его под виндой с опциями /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF. Под Lin - с опциями -O4 -S. Как в студии задать опции /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF? |
Сообщ.
#68
,
|
|
|
Цитата Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам. Да чё ты пристал как пиявка к метапрограммированию. Это всего лишь один из мега-способов сделать нашу жизнь лучше ![]() ![]() Препроцессор.. это вообще в пользу бедных разговоры. Поскольку нет более удобных средств. Максимум для чего нужен - для условной компиляции. Ну ещё есть пара мест, где он к месту (например, декларирование и определение message map-ов в MFC, но там он являеся всего лишь псевдонимом). И после этого привыкшие к #define люди вместо того, что бы корректно унаследоваться или typedef попользовать пишут #define CMyClass std::vector<CMyMiniClass> загляните в исходники C++ ой (совершено не по по праву носящую это имя) библиотечки wxWidgets. И спросите себя - можно ли так писать?.. (MFC в общем то тоже, но меньше ![]() Цитата Размер исполняемого файла под винды: 4096 байт. Размер исполняемого файла под линух: 4718 байт. Часто замечаю, что один и тот же код под Linux-ом и Win весит больше на первом. Это стопудово. Могу даже из залежей что нибудь достать, как до дома доберусь. Да и дистрибутивы под Win и Lin одних и тех же программ под первое весят меньше. Иногда - здорово меньше. |
Сообщ.
#69
,
|
|
|
Цитата the_Shadow @ Слабая аналогия. Аналогия в самый раз. Ибо дело далеко не всегда в используемом инструменте. А компилятор - это инструмент. Цитата the_Shadow @ Нет. Лучше посмотри на lcc. Почему в "стандартном" Visual не так? Может быть, это, от рук зависит? От количества прочитанных манов? Пример смотри выше по тексту. Цитата the_Shadow @ Сильно упрощённо, на мой взгляд. ![]() Цитата the_Shadow @ Flex, вот обрати внимание на то, что я написал выше -- для реализации этих конструкций нужен только ли компилятор? И никакой поддержки в части библиотек? Только компилятор. И никакой поддержки со стороны библиотек. А что поддерживать то? |
Сообщ.
#70
,
|
|
|
Цитата Flex Ferrum @ Опять же, дело не в этом. Ну, вот, к примеру, возьмем C-шный алгоритм сортировки (qsort). Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа? Здесь шаблоны покажут себя гораздо лучше. Это несомненно, ибо у qsort'а будут дополнительные накладные расходы на вызов функции сравнения. Зато qsort не компилится каждый раз ![]() Кажется, дело запало холиваром C vs C++? ![]() |
Сообщ.
#71
,
|
|
|
Цитата linuxfan @ Ты не делаешь strip Размер бинарника 3328 байт, но не забываем, что он еще динамически слинкован с libc.so. Впрочем, у виндового бинарника без kernel32.dll шансы на исполнение тоже невелики Уменьшил значение ALIGN до 512. Получил размер 2560 байт. ![]() Цитата plan699 @ Как в студии задать опции /Ox /MD /FAcs <имя файла> /link /ALIGN:1024 /OPT:REF? Ox - C/C++ -> Optimization -> Optimization -> Full optimization MD - C/C++ -> Code Generation -> Runtime libaray -> Multithread DLL FAcs - C/C++ -> Output Files -> Assembler Output -> Assembly, Machine Code and Source ALIGN:512 - OPL:REF - Linker -> Optimization -> References -> Eliminate Unreferenced Data ALIGN можешь задать в Linker -> Command Line -> Additional Options |
Сообщ.
#72
,
|
|
|
Цитата Специально для Флекса. Метапрограммирование как класс предназначено для описания задачи в максимально удобном для правильной ее постановки виде. Так вот, для написания ядер ОС, когда порою приходится (в трудных случаях) щупать машинный код, который генерируется компилятором, слишком высокий уровень абстракции только мешает. Потом придется все равно сквозь все промежуточные уровни пробраться к истокам. Добавлю ещё одно утверждение. Метапрограммирование вредно при описании полностью определённой задачи. Оно "помогает" порождать сущности, которые не нужны в принципе, т.е., ведёт к усложнению задачи (на уровне исходгого кода в том числе). Вначале надо понять -- а зачем здесь это? И только потом детально разобраться с тем, что же это делает. В случае С проблема так не стоит. Цитата Я не могу понять, почему некоторым людям недостаточно вполне достаточных средств. Добавлю -- и имеющих вполне очевидные и детально описанные интерфейсы. Цитата Применительно к С++ речь обычно идет об обобщенном программировании. И... нафига оно? Цитата Взяли? Теперь вопрос: какие у тебя есть возможности по его оптимизации для сортировки последовательности элементов определенного типа? Взяли. И что дальше? Зачем нужна оптимизация, если он и так достаточно оптимален? Или, будем оптимизировать уже соптимизированное? Цитата Размер исполняемого файла под винды: 4096 байт. Размер исполняемого файла под линух: 4718 байт. Не-а... -O2 -S дают 4688, после strip test получается 2908 (байт). Цитата Что я делаю не так? ;) Ты привёл размер бинарника, содержащего отладочную информацию. Таким образом, корректнее было бы сравнивать с кодом, содержащимся в ветке DEBUG твоего проекта. Достаточно? :D:D:D Добавлено Цитата Кажется, дело запало холиваром C vs C++? :D Оххх... Застрелите кто-нибудь БухгХантера... :D:D:D |
Сообщ.
#73
,
|
|
|
Цитата the_Shadow @ От версии компилятора зависит. 4710 байт, после стриптиза -- 2924. gcc version 4.1.0 20060304 (Red Hat 4.1.0-3) -O2 -S дают 4688, после strip test получается 2908 (байт). |
Сообщ.
#74
,
|
|
|
Цитата Оххх... Застрелите кто-нибудь БухгХантера... ![]() Не, я не против писания под Linux, я против тех методов, которыми это привыкли делать ![]() Препроцессор блин ![]() |
Сообщ.
#75
,
|
|
|
Цитата Аналогия в самый раз. Ибо дело далеко не всегда в используемом инструменте. А компилятор - это инструмент. Инструмент... да... Вот только подход к этому инструменту различен у разных фирм. Даже в среде M$ Борланд как-то не шибко хорошо живёт. А про тот же lcc (и программирование с Win32 API вообще) и собаки не лают -- ну что поделать, если в M$ иное видение. Желающим рекомендую на lcc реализовать модуль .cpl (угу... апплет контрольной панели). Я не говорю что это невозможно. Это, скажем так, затруднительно. Цитата Может быть, это, от рук зависит? От количества прочитанных манов? Пример смотри выше по тексту. Да-да... Именно -- выше по тексту. А теперь сделай над собой усилие и по-пробуй то же под lcc. Я серьёзно говорю. :D:D:D Цитата Только компилятор. И никакой поддержки со стороны библиотек. А что поддерживать то? Fleeeex... Ну не в Linux это. В M$ я не лезу -- это отдельный вопрос. Ну не катит такой подход в Linux. |