Jump to content

    

Размер unsigned int или int Keil4.5

А при чем тут придет и не поймет rolleyes.gif Я беру к себе на работу только тех, кто способен понимать и разобраться. Тогда и Вы ответьте на вопрос: зачем тогда столько "фишек" и примочек в компиляторе? Вы этим не пользуетесь?

Вы же сами наблюдали, как несколько человек с первого взгляда не поверили, что компилятор умеет паковать отдельные переменные. Придёт новый человек и тоже потратит время и нервы на то, чтобы снова выяснить то же самое. Нормальные люди, если требуется, пакуют структуры и пишут комментарии, для чего это делается. Фишки и примочки компилятора реализованы для того, чтобы:

1. Соответствовать стандарту языка. Стандарт языка может при этом содержать совершенно неадекватные конструкции и предположения. Но это стандарт и нужно соответствовать.

2. Для обхода узких мест.

3. Организация данных для соответствия неким стандартам. Например, упаковка данных для DMA или передачи по TCP.

 

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

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

Share this post


Link to post
Share on other sites
Вы же сами наблюдали, как несколько человек с первого взгляда не поверили, что компилятор умеет паковать отдельные переменные. Придёт новый человек и тоже потратит время и нервы на то, чтобы снова выяснить то же самое. Нормальные люди, если требуется, пакуют структуры и пишут комментарии, для чего это делается. Фишки и примочки компилятора реализованы для того, чтобы:

1. Соответствовать стандарту языка. Стандарт языка может при этом содержать совершенно неадекватные конструкции и предположения. Но это стандарт и нужно соответствовать.

2. Для обхода узких мест.

3. Организация данных для соответствия неким стандартам. Например, упаковка данных для DMA или передачи по TCP.

 

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

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

Вы все правильно говорите и занимаете твердую позицию. Ладно. Но мне такая позиция не подходит. Знаете почему? Вокруг меня, кого я знаю, кроме моих сотрудников, никто не пользуется например DMA. А зачем? Вот аргументы, похожие на Ваши. Таких задач не появляется, все и так работает, памяти хватает, скорости тоже и т.д и т. п. Это позиция не для меня. Если такая возможность есть - нужно ее использовать. И знать где, как и правильно. И это - максимальная эффективность. А пытаться обходить... Ну знаете, обойти то все можно. Как раз вот это - кулибин. Не знает языка, не знает компилятора, всех его расширений -но выкрутился, решил задачу. Да еще так, что в ней может разобраться такой же кулибин без глубоких знаний. Я не в Вашу сторону и никого не хочу из публики обидеть, никаких личностей. Мой стиль им оих сотрудников - решать задачу используя все возможности в нужном месте естественно вплоть до недокументированных функций, если это работает корректно.

Share this post


Link to post
Share on other sites
Давайте жить реалиями сегняшнего дня. В основном все уже имеют дело с микроконтроллерами с линейным адресным пространством. В пределах этого пространства компилятор не занимается перестановкой переменных и оптимизацией их размещения, если на то нет особых инструкций, указаний и т. д. Тоесть, компилятор оптимизирует код с обязательным требованием сохранения его идентичности по функционалу исходному коду и не занимается оптимизацией памяти данных

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

Соответственно оптимизатор вполне может перетасовать данные, если это обоснованно и даст какой-то профит.

 

Более того, при определенных настройках тот же GCC может перекладывать данные из секции .data в .bss

Share this post


Link to post
Share on other sites
С первой частью заявления не соглашусь. Пространство хоть и линейно, но это не гарантирует одинаковое время доступа и одинаковое количество инструкций для доступа в ряде случаев.

Соответственно оптимизатор вполне может перетасовать данные, если это обоснованно и даст какой-то профит.

 

Более того, при определенных настройках тот же GCC может перекладывать данные из секции .data в .bss

Послушайте, чесговоря нет времени на такого рода диспут, но когда пишут совершенно непонятные для меня вещи, хочется всегда спросить: откуда вы это взяли?!!! Ну откуда вы взяли что время доступа может быть разны, если переменные размещаются в ОЗУ? Мы же не ведем речь о переменных и сразу о константах, которые размещаются в адресном пространстве кода? Ну я вот хочу знать того, чего не знаю. Покажите мне не на пальцах, а на конкретном примере. И еще, какие такие настройки компилера позволят две однородные переменные без инициализации на стадии линковки или обе с инициализацией, расположенные в одном программном модуле последовательно друг за другом разнести по разным секциям? Пожете показать, как Вы это делаете? :rolleyes:

Share this post


Link to post
Share on other sites
Ну откуда вы взяли что время доступа может быть разны, если переменные размещаются в ОЗУ? Мы же не ведем речь о переменных и сразу о константах, которые размещаются в адресном пространстве кода? Ну я вот хочу знать того, чего не знаю. Покажите мне не на пальцах, а на конкретном примере.

Позвольте встрять? ;)

 

Кроме внутреннего ОЗУ, к контроллеру может быть подцеплено внешнее, с другим временем доступа.

Даже если есть только внутреннее, то в некоторых процессорах есть разные RAM с разным быстродействием, расположенные на разных шинах.

Или, к примеру: внутреннее ОЗУ разбито на банки (непрерывно расположенные в адресном пространстве), и одна из переменных - в одном банке, другая - в другом, а во второй банк как раз идёт интенсивное DMA (с приоритетом контроллера DMA) - здесь разница во времени доступа может быть ОЧЕНЬ большой.

Даже если банки ОЗУ в несмежных областях - линкер (при соотв. опциях) может разбить выходные секции на неск. несмежных областей.

Для каких-то областей может быть включено/выключено кеширование.

Или (типичная оптимизация IAR for ARM): функция работает с неск. статическими переменными - IAR заносит в некий базовый регистр указатель на область памяти, которая включает большую часть этих переменных и адресует их через этот базовый + смещение, а одна переменная - далеко от остальных, разрядности смещения не хватает и для обращения к ней компилятору приходится вставлять доп. инструкции загрузки адреса этой переменной в регистр - соответственно доступ к этой переменной будет дольше.

 

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

 

Share this post


Link to post
Share on other sites
Позвольте встрять? ;)

 

Или (типичная оптимизация IAR for ARM): функция работает с неск. статическими переменными - IAR заносит в некий базовый регистр указатель на область памяти, которая включает большую часть этих переменных и адресует их через этот базовый + смещение, а одна переменная - далеко от остальных, разрядности смещения не хватает и для обращения к ней компилятору приходится вставлять доп. инструкции загрузки адреса этой переменной в регистр - соответственно доступ к этой переменной будет дольше.

 

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

За меня уже ответили. Спасибо :)

 

К тому же GCC при определнных опциях может перемещать переменные явно инициализированные нулем (т.е. те, которые должны бы попасть в секцию .data) в облась .bss. Профит от этого, я надеюсь, очевиден.

Share this post


Link to post
Share on other sites
Позвольте встрять? ;)

 

Кроме внутреннего ОЗУ, к контроллеру может быть подцеплено внешнее, с другим временем доступа.

Даже если есть только внутреннее, то в некоторых процессорах есть разные RAM с разным быстродействием, расположенные на разных шинах.

Или, к примеру: внутреннее ОЗУ разбито на банки (непрерывно расположенные в адресном пространстве), и одна из переменных - в одном банке, другая - в другом, а во второй банк как раз идёт интенсивное DMA (с приоритетом контроллера DMA) - здесь разница во времени доступа может быть ОЧЕНЬ большой.

Даже если банки ОЗУ в несмежных областях - линкер (при соотв. опциях) может разбить выходные секции на неск. несмежных областей.

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

Рабята, ну я Вас умаляю... :rolleyes: Ну Вы что, читать не умеете? Я же ясно написал, две переменные, одинаково объявленные и т.д. Вам, что, все это пустой звук или есть просто желание поговорить? :rolleyes: Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает? Все остальное и комментировать нет смысла. Вам уже aaarrr выше в этой теме написал - размещение переменных, в том числе акккуратность этого размещения- это задача программиста. И я в этом согласен. А вот аккуратностью размещения кода занимается компилятор, а затем оптимизатор. Об этом даже в Википедии почитать можно. Там нет ни слова об оптимизации данных. Судя по-всему, никто из написавших выше никогда не проверял, что же реально компилятор и оптимизатор творят с переменными, но, основываясь на каком то внутреннем понимании этого процесса :rolleyes: пытается утверждать, что так оно и есть.

Share this post


Link to post
Share on other sites
Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает?
Я.

 

Share this post


Link to post
Share on other sites
Рабята, ну я Вас умаляю... :rolleyes: Ну Вы что, читать не умеете? Я же ясно написал, две переменные, одинаково объявленные и т.д. Вам, что, все это пустой звук или есть просто желание поговорить? :rolleyes: Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает?

Меня умолять не надо - Вы почитайте описание на любой компоновщик. Я вам вроде ясные примеры привёл.

Ничто не мешает компоновщику раскидать одноимённые входные секции (к примеру - секции .bss) по разным регионам памяти при наличии соответствующего ключа в конфигурации.

 

Судя по-всему, никто из написавших выше никогда не проверял, что же реально компилятор и оптимизатор творят с переменными, но, основываясь на каком то внутреннем понимании этого процесса :rolleyes: пытается утверждать, что так оно и есть.

Вы сами-то хотя-бы раз заглядывали в ассемблерные листинги после компилятора? Поинтересуйтесь вместо того чтобы писать тут ерунду.

Share this post


Link to post
Share on other sites
занимается компилятор, а затем оптимизатор. Об этом даже в Википедии

Покажите, где написано (в Википедии, или еще где-то), что есть некий зверь, именуемый "оптимизатором", который занимается размещением то ли кода, то ли данных.

Share this post


Link to post
Share on other sites
Рабята, ну я Вас умаляю...

Может, умОляю? Иначе смысл какой-то стрёмный...

:bb-offtopic:

Я вот читаю, и, честно говоря, немного офигеваю. Тема начинается с абсолютно ламерского вопроса, а спустя буквально пару страниц топикстартер уже с важным видом всех поучает. Может, всё же прислушаться к мнению более опытных товарищей? Тем более, что уже и пример перестановки компилятором переменных привели, и даже с листингом.

Share this post


Link to post
Share on other sites
Покажите, где написано (в Википедии, или еще где-то), что есть некий зверь, именуемый "оптимизатором", который занимается размещением то ли кода, то ли данных.

Википедия это конечно АВТОРИТЕТ! Любой TAutomatic знает :w00t:

Share this post


Link to post
Share on other sites
Все правильно, спасибо за цитату :rolleyes: Теперь попытаюсь Вам концептуально разъяснить в чем дело.

Вы не о том возражаете по цитате :rolleyes:

Два массива могли бы оказаться где угодно, а не друг рядом с другом.

 

Share this post


Link to post
Share on other sites
Может, умОляю? Иначе смысл какой-то стрёмный...

:bb-offtopic:

Я вот читаю, и, честно говоря, немного офигеваю. Тема начинается с абсолютно ламерского вопроса, а спустя буквально пару страниц топикстартер уже с важным видом всех поучает. Может, всё же прислушаться к мнению более опытных товарищей? Тем более, что уже и пример перестановки компилятором переменных привели, и даже с листингом.

Ух ты, как вас уже много высказаться :rolleyes: Пример? Автор примера о перстановке переменных что то пропал после моего вопроса, как он так сделал :rolleyes:

Share this post


Link to post
Share on other sites

Какой упоротый попался... Вам уже цитату из Шилдта привели, чего еще надо?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this