реклама на сайте
подробности

 
 
9 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> К знатокам, Локальные переменные.
SasaVitebsk
сообщение Sep 18 2007, 23:46
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Dog Pawlowa @ Sep 18 2007, 19:30) *
Все здорово, не затронут оказался компилятор. Как-то мне с трудом верится, что он оптимизирует так хорошо. Если бы он был таким умным, то мог бы вставлять команды с использованием смещения во время доступа к соседним ячейкам независимо от того, определены они как элементы структуры, или как разные переменные.
А если ему нужно помогать, используя указатель на структуру, это значит, нужно самому программисту заниматься оптимизацией.
Дальше только писать на ассемблере....


А зря не верится. И я тоже не верил. Более того, когда писал на асме вообще не использовал данные команды. Считал их бесполезными. smile.gif Оно и понятно. Применение команд типа LDD где используется смещение делает прогу на асме фактически нечитаемой. К чему обращаешься - непонятно. Другое дело компилятор. Ему на читаемость результирующего листинга асм - наплевать. Он даже мнемонические имена в константы рубит. Зато автоматически расчитывает смещение.

Не смею утверждать, но по моему он даже делает анализ совместного применения переменных и размещает их рядом в памяти. Чтобы удобнее было.

Во всяком случае применение команд LDD и STD очень широкое.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 19 2007, 04:18
Сообщение #32


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 19 2007, 01:41) *
А вот здесь я бы на Вашем месте сильно не спешил.
Дело в том, что любой код на С++ может быть преренесен на С без потери скорости/компактности,
а обратное к сожалению не верно, те код на С перенесенный на С++ гарантированно будет
не меньше/не быстрее чем исходный.

smile.gif С++ на С не переносится в принципе, т.к. С является подмножеством С++ (хотя и не 100% совместимым). А вот С-код на С++ переносится достаточно легко, в некоторых случаях даже делать ничего не надо, он сразу работает. И по эффективности тут никаких потерь нет. Попробуйте какую-нибудь С программу, написанную под IAR С скомпилить тем же IAR'ом в С++ режиме. Сравните результат. smile.gif

Цитата(singlskv @ Sep 19 2007, 01:41) *
Собственно часть компиляторов так и работает, считая код на С++ препроцессорной
надстройкой над С...

Это вы про С с классами говорите, который компилировался С front. Ну, так это еще не полноценный С++, а его предтеча. Давайте уже оперировать реалиями сегодняшнего дня.

Цитата(SasaVitebsk @ Sep 19 2007, 06:46) *
А зря не верится. И я тоже не верил. Более того, когда писал на асме вообще не использовал данные команды. Считал их бесполезными. smile.gif Оно и понятно. Применение команд типа LDD где используется смещение делает прогу на асме фактически нечитаемой. К чему обращаешься - непонятно.

Ну, это как писать. Сделайте смещения именованными и все сразу станет понятно. Когда-то, когда я в целях тренировки кое-что еще писал на асм для AVR, делал так (писано было еще в 1998 году, пакет - незабвенный IAR 1.40 smile.gif ):

Код
#define LASER_CODE           0
#define TPREVIOUS_POINT      2
#define STATE                4
#define NSPURIOUS            5
#define NSYMBOLS             6
#define FLASER_CODE_DONE     7

  rseg    UDATA0

     Laser_code:         ds   2   ; 0-1
     tPrevious_point:    ds   2   ; 2-3
     State:              ds   1   ; 4
     nSpurious:          ds   1   ; 5
     nSymbols:           ds   1   ; 6
     fLaser_code_done:   ds   1   ; 7
...

  rseg    RCODE
    ...
    ldi   r30, low(Laser_code)
    ldi   r31,high(Laser_code)
    ...
    ldd   r18,Z+TPREVIOUS_POINT        ;  load previous point
    ldd   r19,Z+TPREVIOUS_POINT + 1    ;
    ...
    ldd   r18,Z+STATE                  ; load state
    ...
    ldd   r18,Z+LASER_CODE   ; load laser code
    ldd   r19,Z+LASER_CODE+1 ;
    ror   r19                ; modify laser code
    ror   r18                ;
    std   Z+LASER_CODE,r18   ; store laser code
    std   Z+LASER_CODE+1,r19 ;
    ...
    std   Z+TPREVIOUS_POINT,r20   ; store current point as previous
    std   Z+TPREVIOUS_POINT+1,r21 ;
                             ;
    ldd   r18,Z+NSYMBOLS     ;
    inc   r18                ; inc nSymbols
    std   Z+NSYMBOLS,r18     ;
    ...
    ldd   r18,Z+NSPURIOUS              ;  inc nSpurious
    inc   r18                          ;
    std   Z+NSPURIOUS,r18              ;
    ...


и т.д. Как видите, все вполне читаемо и понятно. Код оптимален. По сути тут руками сделана оптимизация Clustering variables.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 19 2007, 05:23
Сообщение #33


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(IgorKossak @ Sep 18 2007, 21:07) *
Если речь зашла о компиляторе IAR, то ему как раз и не нужно помогать рассовывая локальные (да и не только) переменные по структурам или массивам. Он и сам это прекрасно делает если ему задать оптимизацию Clustering of variables.


Делать то он это делает, но в некоторых случаях лучше кластеризацию отключать - пример я приводил выше, при отключении освобождается индексный регистр и код резко (!) уменьшается (как по размеру, так и по времени выполнения).

Так что при выжимании максимальных характеристик смотреть в листинг и крутить настройки компилятора все равно надо. Другое дело, что при написании такого куска на асме (как многие считают - будет лучше всех) каждая итерация будет занимать очень много времени (все руками делается), а на Си - все намного быстрее.

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 19 2007, 05:57
Сообщение #34


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Rst7 @ Sep 19 2007, 09:23) *
А вот C++ - штука двоякая, главное достоинство - чуть меньше писанины

Писанины поменьше - это не главное.
А главное, на мой взгляд, следующее:
- наращивание проекта при нормальном наследовании не ведет к его необозримости;
- все ошибки локализованы в объектах;
- простая корректировка.
С++ был создан для больших проектов. В С нужно в куче мест подправить, а в С++ в одном.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 19 2007, 12:18
Сообщение #35


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Rst7 @ Sep 19 2007, 12:23) *
А вот C++ - штука двоякая, главное достоинство - чуть меньше писанины, но есть и подводные камни. Например, в связи с ограниченностью количества индексных регистров возможно код с классами будет хуже - из-за неявного this, занимающего пару регистров.

Отнюдь. В С код при обращении к структуре будет таким же - компилятор загрузит в pointer адрес структуры и будет обращаться со смещением. Ровно как и в случае с классом. Потому, что это эффективно. Если это менее эффективно - например, надо, скажем, всего одно член-данное прочитать и выгоднее обратиться напрямую, то ничего не мешает это сделать и в случае с С-структурой, и в случае с С++-классов. Это все зависит от компилятора, а не от языка.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 19 2007, 12:34
Сообщение #36


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(dxp @ Sep 19 2007, 15:18) *
Отнюдь. В С код при обращении к структуре будет таким же - компилятор загрузит в pointer адрес структуры и будет обращаться со смещением. Ровно как и в случае с классом. Потому, что это эффективно. Если это менее эффективно - например, надо, скажем, всего одно член-данное прочитать и выгоднее обратиться напрямую, то ничего не мешает это сделать и в случае с С-структурой, и в случае с С++-классов. Это все зависит от компилятора, а не от языка.


ключевое слово в моем посте - "возможно".

Хуже будет если, например, размер класса больше максимально допустимого смещения в команде индексной адресации. Или нужен лишний указатель. И еще можно придумать сто вариантов. Или будет также как и на чистом Си. Лучше - не будет. Следовательно - плюс цпп - только уменьшение писаниы.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 19 2007, 12:54
Сообщение #37


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Rst7 @ Sep 19 2007, 16:34) *
ключевое слово в моем посте - "возможно".

Хуже будет если, например, размер класса больше максимально допустимого смещения в команде индексной адресации. Или нужен лишний указатель. И еще можно придумать сто вариантов. Или будет также как и на чистом Си. Лучше - не будет. Следовательно - плюс цпп - только уменьшение писаниы.

Если у бабушки были бы усы и борода - она была бы дедушкой. (Народная мудрость).
А серьезно, все может быть.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 19 2007, 13:21
Сообщение #38


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Rst7 @ Sep 19 2007, 19:34) *
Хуже будет если, например, размер класса больше максимально допустимого смещения в команде индексной адресации. Или нужен лишний указатель. И еще можно придумать сто вариантов. Или будет также как и на чистом Си. Лучше - не будет. Следовательно - плюс цпп - только уменьшение писаниы.

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 19 2007, 19:59
Сообщение #39


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(dxp @ Sep 19 2007, 08:18) *
smile.gif С++ на С не переносится в принципе, т.к. С является подмножеством С++ (хотя и не 100% совместимым). А вот С-код на С++ переносится достаточно легко, в некоторых случаях даже делать ничего не надо, он сразу работает. И по эффективности тут никаких потерь нет. Попробуйте какую-нибудь С программу, написанную под IAR С скомпилить тем же IAR'ом в С++ режиме. Сравните результат. smile.gif
Вы не внимательно читали мои посты, я говорил лишь о том что любую прогу
на С++ можно написать на С не менее эфективно(почти всегда более эфективно).
Правда, усилий может понадобится больше.
В конечном итоге это примерно такой же спор как насчет С vs ASM.
Очевидно что на ASM всегда можно написать лучше(быстрее/компактнее по коду) чем на С.
так же для меня вполне очевидно, что то же будет касаться С++ vs C.
Вопрос скорее в решаемой задаче и в количестве железных ресурсов которые
не жалко...
Ок, задам Вам такой вопрос:
как Вы относитесь к "прерываниям с классами" ?
Цитата
Это вы про С с классами говорите, который компилировался С front. Ну, так это еще не полноценный С++, а его предтеча. Давайте уже оперировать реалиями сегодняшнего дня.
Да, это действительно был Cfront в редакции AT&T кажись..., подзабылось уже...
Тока тогда он уже был С++ с практически всеми атрибутами современных версий,
по моему, исключений еще небыло в современном виде, а шаблоны уже были...
Вобщем здесь уже спорить не буду, не помню всех деталей...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 19 2007, 21:03
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 19 2007, 22:59) *
Очевидно что на ASM всегда можно написать лучше(быстрее/компактнее по коду) чем на С.
так же для меня вполне очевидно, что то же будет касаться С++ vs C.

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

Когда в 80x годах я взялся за C++, причем за именно ++, а не 'С', то с моей первой программой приключилась такая история - я выиграл спор smile.gif. Потребовалась во времена IBM PC/XT для сугубо личных целей простенькая псевдографическая текстовая библиотечка. В общем ничего сверестественного открять окошко-(вывести текст) - еще несколько огошек, перекрытие, всплытие - все без особых затей. Ну и начал С++ изучать. Был у менгя парень, очень талантливый, уже несколько лет много пишущий на 'C' и виртуозно на ASM - он меня от плюсов отговаривал сильно, ну монстрально, тормознуто и т.д.... Я не отступал и он предложил мне доказать, написав библиотеку на 'C' и используя ее в одной и той-те тестовой программе убедиться в жуткой тормознутости C++. Причем в те времена 4,7 Mhz процессоров скорость прекрасно оченивалась невооруженным взглядом smile.gif.
За несколько недель, вечерами-урывками почти за одинаковое время были написаны две библиотеки.
Напоминаю, это была моя первая программа! Моя C++ была меньше по размеру исходников, меньше по размеру кода и работала быстрее. Причем при этом я Турбодебагером не пользовался - ну просто некогда было изучать smile.gif, да и само заработало, а коллега довольно плотно в отладке сидел. Случай, конечно, несколько вырожденный, ибо уж больно оконные задачи на плюсы хорошо легли... На самом деле обе работали очень медленно sad.gif Пошли вставки на ASM, коллега уязвленный потратил массу времени на вылизывание сишного варианта, все находки были реализованы, листинги вычитаны... В конце-концов библиотека стала сишной с очень большими вкраплениями ASM. Но в принципе переход на C был обусловлен изрядной тупостью первого Борландячего плюсового компилятора. Уже в более поздние времена работая с Watcom явных претензий к реализации С++ не было. Да и Борланд попозже исправился, до того, что я стал старые Борландячие проекты (да и вообще все) компилить плюсовым компилятором - эффективнее получалось!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 19 2007, 21:27
Сообщение #41


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 20 2007, 01:03) *
Оба этих утверждения при имеющейся тенденциям к
- усложнению программ;
- уменьшению времени на их разработку;
- уменьшения времени жизни целевого железа;
- увеличении цены ошибки;
Становятся все больше и больше гипотетическими и все нереализуемее на практике.
Толку в гипотетических преимуществах, если за обозримое время и деньги их нельзя реализовать.
Вот с этим соглашусь практически полностью,
ну на 50% процентов как минимум,
нужно тока рассматривать это относительно существуещего железа,
С действительно уже практически заменил АСМ,
C++ Еще совсем нет. То есть его уже как бы вполне можно использовать, но тока
пока не в критичных по времени выполнения процедурах.
Повторюсь, Вы используете "Прерывания с классами"?
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 20 2007, 03:19
Сообщение #42


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 20 2007, 02:59) *
Вы не внимательно читали мои посты, я говорил лишь о том что любую прогу
на С++ можно написать на С не менее эфективно(почти всегда более эфективно).
Правда, усилий может понадобится больше.

Я внимательно читал. И обратное утверждение верно.

Цитата(singlskv @ Sep 20 2007, 02:59) *
В конечном итоге это примерно такой же спор как насчет С vs ASM.

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

Цитата(singlskv @ Sep 20 2007, 02:59) *
Очевидно что на ASM всегда можно написать лучше(быстрее/компактнее по коду) чем на С.

Да. Хотя на практике случаи бывают и обратные.

Цитата(singlskv @ Sep 20 2007, 02:59) *
так же для меня вполне очевидно, что то же будет касаться С++ vs C.

См выше.

Цитата(singlskv @ Sep 20 2007, 02:59) *
Ок, задам Вам такой вопрос:
как Вы относитесь к "прерываниям с классами" ?

Что такое "прерывания с классами"?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 20 2007, 04:58
Сообщение #43


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(singlskv @ Sep 20 2007, 01:27) *
Повторюсь, Вы используете "Прерывания с классами"?

Извините меня за тупость, но я что-то не понимаю.
Есть класс. Часть его функций используется не в прерываниях, часть в прерываниях. Я это применяю и проблем никогда не имею.
А что такое "прерывания с классами" я не могу понять (может что-то новенькое).
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 20 2007, 11:42
Сообщение #44


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(alexander55 @ Sep 20 2007, 08:58) *
А что такое "прерывания с классами" я не могу понять (может что-то новенькое).


Может имелся в виду вызов методов класса из прерываний?

Лично у меня очень часто, иногда - даже виртуальные smile.gif ...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 20 2007, 16:13
Сообщение #45


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Непомнящий Евгений @ Sep 20 2007, 15:42) *
Может имелся в виду вызов методов класса из прерываний?
Лично у меня очень часто, иногда - даже виртуальные smile.gif ...
Примерно это и имелось в виду.

А на каком проце вы вызываете виртуальные методы классов из прерывания ?

Видимо джиттер в Ваших задачах несущественен ?
Go to the top of the page
 
+Quote Post

9 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01557 секунд с 7
ELECTRONIX ©2004-2016