|
COM‐пропагандист
|
||||||
Общие вопросы и приёмы эффективного программирования на BASIC27.03.2021, 15:34. Показов 32477. Ответов 391
Метки нет (Все метки)
Вот как создать кнопку:
0
|
||||||
| 27.03.2021, 15:34 | |
|
Ответы с готовыми решениями:
391
Общие вопросы по языку 1с Visual Basic Приемы взаимодействия Visual Basic и SQL Основные понятия и приемы программирования |
|
Модератор
|
|||||||
| 04.04.2021, 20:31 | |||||||
0
|
|||||||
|
Кормпилятор
|
|||
| 05.04.2021, 07:52 | |||
Тратить целый регистр на хранение указателя - это не по мне. Вообще забавно вы ребятки спорите. Уверен, вот нифига вы не писали на асме тяжёлые алгоритмы не старых машинах. Добавлено через 13 минут в том что вы с Замабувараев вещаете это как единственно допустимую истину и говорите что быстрее, где оно быстрее? Если я заведу память заранее. Где эта скорость себя окупит? На 386-м? Почему при всех этих бенефитах не рассказано, как проверить стек и как изменить его размер. А так же не рассказано, что стек будет заведён перманентно и будет занимать память не по необзходимости а просто займёт сразу. В то время как программа которая написана с классическим резервированием памяти из хепа будет высвобождать эту память, отдавая ресурс другим приложениям в системе и не занимая его попусту. Повторяю ещё раз это не аксиома для всех ЯП, на паскале и на бейсике нет этого функционала, на некоторых диалектах только через вставки. Это прерогатива в большей степени низкого уровня.
0
|
|||
|
COM‐пропагандист
|
|||||||
| 05.04.2021, 08:26 [ТС] | |||||||
|
Вот что выдаёт FreeBASIC на x64:
Система выделяет целый мегабайт памяти на стэк, но это настраивается в параметрах компоновщика, так что все локальные переменные влезут.
0
|
|||||||
|
Модератор
|
|||||
| 05.04.2021, 08:47 | |||||
|
0
|
|||||
|
Кормпилятор
|
||||||
| 05.04.2021, 09:27 | ||||||
|
если всё динамическое(а скорее всего в приличной проге так и будет) и там десятки и сотни мегабайт крутятся, то какой нафиг стек. Конечно локальные переменные хранятся в стеке, где им ещё храниться? И конечно есть возможность хранить там в виде ByVal сами значения, но надо понимать чем это чревато, с этим надо осторожно работать. И речь даже не о вас, кто знает, а о тех людях, кто не особо знаком с этими проблемами, возьмут и захотят гигабайт в стеке завести, потому что им сказали что оно быстрее, будут сидеть чесать репу, мол что не так. Или начнут сравнивать, заведут там и там. Увидят одинаковую скорость и не поймут почему быстрее, что бенефит в виде мелкозернистого резервирования памяти. Чтобы этот бенефит прочувствовать нужен ещё и алгоритм соответствующий. А тут разговор за строки идёт причём просто так, не применительно вообще к чему-то. Ну вот я и спросил где такой софт, который тупо 100% времени ЦП работает со строками. И что этот софт резервирует гигабайты стека? Где такое есть вообще? И смысл тогда во всём этом? Если речь о ВУ, на большей части которого его даже и нет, т.е. аппаратного процессорного стека, а не самопальной эмуляции простой структуры. Правила все на ВУ. В машинных организуй как хочешь, на что мозгов хватает, там другие критерии, все ресурсы отдаются под полный контроль программиста. Я туда например вообще не лезу, пока меня всё устраивает на ВУ, вот когда перестаёт устраивать - тогда да. особенности и регистров больше. Так делал только тогда, когда было лень самому считать смещения или цикл не давал это делать нормально. Хотя принципы экономии регистров всё те же. А вот на 32 и 16 - это важно про что пишу. Потому как на элементарщину даже их не хватало. Просто выводы не делаю на этих "сферах в вакууме". Попиши на асме алгоритмы с точки зрения оптимизации, сразу поймёшь, про что говорю в этой теме. Причём попиши без помощи ВУ именно сам руками организацию делай, раскидывай регистры по переменным и т.п., там просто классическая вещь будет, листик слева код, справа все используемые регистры в тек момент. Желательно это делать на старом компе, чтобы даже на глаз понимать где быстрее работает. И нюансов там на самом деле много. Но один из нюансов уменьшать объём кода, кол-во команд, а также зависимых команд. А ещё выравнивание, это не сложно само по себе, только с точки зрения алгоритма, алгоритм потому что приходится дробить на несколько частей. Эффективный код это вопрос тестирования больше. Есть у тебя штат 5-10 компов, со старых до новых - тогда будет круто и хорошо. А просто какие-то идеологии муссировать - круто не будет. к каждому компилятору, что он там сохраняет, а что нет, по умолчанию если без док всегда считаю что компилятор ничего не сохраняет и делаются минимальные pusha\popa. Бывает и не пишут таких нюансов, или просто фиг найдёшь в справке. Когда на чистом асме писал под DOS просто сохранял\восстанавливал все используемые регистры руками и всё, никаких прологов этих Enter\Leave, в гробу я их видал. И сегменты все руками настраивал включая стек. Но регистров лишних не было никогда, всегда все использовались по максималке. Всё, что можно считать в регистрах лучше считать в регистрах. обычной работы со строками, где-либо вывести строки, либо сохранить на диск. Первое обычно синхронизировано по частоте развертки, второе просто делается медленнее в разы и тут это не является тем фактором который может затормозить. Вот серьёзно, зачем туда вообще лезть? И почему строки? А не какой-то специфический алгоритм. Просто не вижу профита, такого, чтобы прям профит видимый на глаз. Ладно там даже 10%, вообще мизерный профит, но профит, но эти копейки вычленять какие-то гипотетические. Мне вот это не понятно, за что мы тут в реале пытаемся спорить.
0
|
||||||
|
COM‐пропагандист
|
||
| 05.04.2021, 09:41 [ТС] | ||
|
Доступ к локальным переменным идёт по положительному смещению: ebp[8], ebp[12], ebp[16] и тому подобное тагдалее. Доступ к параметрам идёт по отрицательному смещению: ebp[-8], ebp[-12], ebp[-16] и прочее. Всё просто же. (для x64 первые четыре параметра передаются в регистрах, а потом в стэке)
0
|
||
|
Кормпилятор
|
||||||
| 05.04.2021, 09:47 | ||||||
|
я в них ничерта не пойму, я 4 года не кодил серьёзно, чтобы лезть на чужой диалект, в чужие либы и чё-то там пытаться найти ещё, это больше на троллинг меня похоже. Но уверен люди не дураки, там стопудово ссаная мелочёвка, какие-то крупные и сложные алгоритмы за это дело не цепляют. того, сколько стека резервировать? Почему система тогда не резервирует стеку сразу объём равный всей физической памяти? Может быть вся эта система работает как говно? И начинает задирать жёсткие диски ![]() И люди не хотят с ней связываться. Добавлено через 2 минуты
0
|
||||||
|
Модератор
|
|||
| 05.04.2021, 09:50 | |||
|
0
|
|||
|
COM‐пропагандист
|
||
| 05.04.2021, 10:07 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||||
| 05.04.2021, 10:15 | |||||||||
0
|
|||||||||
|
Кормпилятор
|
|||
| 05.04.2021, 10:37 | |||
|
и вроде уже становится понятно, что об оптимальном коде речи нет, т.к. регистр просран. Да компиляторы конечно уже как шахматные движки, но всё же, бывает и фигню морозят, например об этом довольно давно писал автор VirtualDub. Я же пишу про то что на бейсиках и паскалях и даже на твоём VB - этого функционала нет. Этим тоже занимается компилятор, или можно заняться самому вставкой. И в чём тогда вопрос, разрабы компиляторов что лохи сделать совсем дерьмовую систему? Я вот кодил на PB, реально Turbo диалект, очень быстрый в задачах. FB тоже хватает настолько чтобы до готовности почти любого софта забыть про ASM, редко что-то. И тут мне начинают втирать что какие-то проблемы со строками, с памятью. Ну ёлы палы. Вот под DOS-ом были проблемы, там вообще памяти не было, а сейчас всё зашибенно работает, кодерам вообще делать считай ничего не надо, оптимизируется за них, памяти дофига, ну на 2-4 гига можно спокойно рассчитывать, куча ядер у проца. И вот про что я пишу, про стек, на ассемблере, раз на этих наших бейсиках он есть в виде вставок. Если у нас алгоритм, допустим даже, не знаю, простая сортировка, там уже больше переменных чем регистров, сравниваем два значения значит нужно иметь два индексных регистра два счётчика и два регистра общего назначения, двойной цикл - плюс ещё регистр, и нужен стек, потому что внутри цикла идёт push/pop, по любому идёт, если мы не используем глобалки. И если под DOS я понимал как их проще индексировать, скопировал ds(там ещё было два халявных fs\gs) то тут как-бы бошкой приходится думать. И стек как бы важен алгоритмически, в него быстрее пишется\читается(на старых ПК), не сильно но быстрее, нельзя указатель двигать в цикле иначе будет жопа, это о том что нужны регистры и не везде можно это сделать. А если сделал то будь добр подвинуть указатель назад, т.к. в стеке данные, которые нужно вернуть соотв. кускам кода. locm говорил про уровень ответственности, надо объяснять уровень ответственности при таком раскладе? И это только старт, когда ещё ничего не взвешено, нет готового кода, нет 5-10 вариантов куда переместить те или иные переменные по регистрам, чтобы сократить кол-во команд. И с каждой такой веткой вариантов всё меньше и меньше. Вот что такое оптимизация. Конечно я удавлюсь за лишний регистр, если я вообще решился полезть на асм. А иначе зачем лезть? Написать на асме можно и хуже. Твой VB вон как лихо там лопатит под пенёк код, спаривает инструкции, урабатывает более короткие по объёму кода варианты. FB так не умеет. Добавлено через 17 минут Мне то он что, у меня FB, весь код рукописный.
0
|
|||
|
COM‐пропагандист
|
|||||||
| 05.04.2021, 10:41 [ТС] | |||||||
|
Модификатор Naked заставляет компилятор создавать процедуры без какого‐либо кода пролога/эпилога. Это полезно при написании небольших, быстрых функций с ассемблерными вставками без накладных расходов. Пример:
0
|
|||||||
|
Кормпилятор
|
|||
| 05.04.2021, 11:05 | |||
|
Про то, что это не применимо везде и даже на си в плане оптимизации, когда алгоритм станет чуть сложнее ровно настолько, чтобы все промежуточные переменные уже не лезли в регистры. Компилятор там конечно начнёт изворачиваться всячески, циклы разворачивать, выравнивание данных делать, но это всё немного не о том, о чём пишу. И например если не в функции, а просто в main-е. Вначале проги завести эту самую стековую память и такие нормальные алгоритмы, которые забьют все регистры и по 3 вложенных цикла делать, что там компилятор выдумает? Думаю ничего хорошего. Вообще на асм под другим углом посмотрел, мне он теперь больше для логических штук и битики отфильтровать и подвигать, вот это удобно. Добавлено через 8 минут Замабувараев ну а то, что ты отцитировал так Анатолий о другом писал. Он как раз не о вставке. вставкой то понятно. Это больше мы спорим по НУ/ВУ. В FB нет функций как в си просто взять и выделить память в стеке, да ещё и динамический объём. Или может психи разрабы уже добавили?
0
|
|||
|
Модератор
|
||||||||||||||
| 05.04.2021, 11:52 | ||||||||||||||
0
|
||||||||||||||
|
|
||
| 05.04.2021, 12:02 | ||
|
0
|
||
|
Модератор
|
||||
| 05.04.2021, 12:08 | ||||
|
Вот твои высказывания: >>Ничем. Эту тему я поднимал ещё ой как давно. Мужики по-моему над нами угарают. >>Не знаю где люди этого набрались и почему нам выдают эти мимолётные вещи в виде понта за прописные истины. >>И так понятно что это не ВУ и стандартом никогда не станет, что такой код это исключительно >>рукописное асмовое, применимое строго местно и микроскопически. ну и т.д. подобные заблуждения.
0
|
||||
|
Модератор
|
||
| 05.04.2021, 12:58 | ||
|
0
|
||
|
|
|
| 05.04.2021, 13:28 | |
|
Крис Касперски писал, цитата, - "за размещение массивов в стеке давно пора расстреливать". Думаю, что он был прав, светлая ему память. Как то люди позабыли, что есть разные сегменты памяти, а не только сегмент стека. Есть глобальная секция data. И не нужно её бояться, так как она глобальна только для файла - единицы компиляции, чем обеспечивается модульность проекта. Особенно вредно в стеке размещать константные строки, так как они на стадии компиляции кладутся в секцию данных, а уже на стадии исполнения копируются в стек. А это ощутимые тормоза, причем совершенно бессмысленные. Для динамических строк есть куча. Стек же предназначен для хранения параметров и промежуточных(автоматических) переменных, ну и адресов возврата для функций. можно еще вспомнить хакерские атаки на стек, в которых массивы иногда выполняют функцию хранения шелл-кода. Короче говоря не надо пихать массивы в стек, это не кошерно.
0
|
|
|
Модератор
|
|||
| 05.04.2021, 14:04 | |||
|
0
|
|||
| 05.04.2021, 14:04 | |
|
Помогаю со студенческими работами здесь
120
Стоит ли изучать как устроена ЭВМ для эффективного программирования Подскажите ссылки на приемы программирования для Embedded
Интересны приемы программирования, о которых не пишут в книгах, а которые узнаются на практике Общие вопросы. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|