Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 16:25   #71
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Если компилятор её сам за тело цикла не выставит - да. Будит дергаться.
Даже если не говорить об оптимизации - компилятору банально нет смысла это делать. Менять esp в конце итерации, чтобы вернуть его на место вначале - абсолютно бессмысленное действие. Это будет выглядеть примерно так -
Код:
L1:
  sub esp, 4
  //тело цикла
  add esp, 4
  jmp L1
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2011, 16:28   #72
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Даже если не говорить об оптимизации - компилятору банально нет смысла это делать. Менять esp в конце итерации, чтобы вернуть его на место вначале - абсолютно бессмысленное действие. Это будет выглядеть примерно так -
если бы оптимизации не было вообще, то было бы так между прочим, ибо конец блока
а вот даже базовая оптимизация делает примерно так:
Код:
{
    char c;
    int i;
    //etc
    for(i=0;i<H;i++)
    {
        //тело
    }
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.12.2011, 16:34   #73
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение

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

Сама память уже не выделяется и не удаляется

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
компиляторы имеют довольно хороший оптимизатор.
если хотите можно проверить на gcc(MinGW) и студии.

да и команда sub esp,1 ;//(если без выравнивания)
довольна быстра. потому даже без оптимизации скорость не упадет в общем то.
А если "не в общем то", а конкретно вообще не упадёт?

Программист на с++ не должен:
1. Уповать на компилятор.
2. Думать в терминах другого языка программирования.

Он должен решать задачи максимально эффективным способом на своём уровне, при помощи своего языка.

Вынеси переменную за тело цикла - и ни с кем не имей никаких проблем.

Оставь её в теле цикла - и беги учить ассемблер, что бы теперь следить за каждым компилятором, оптимизировал ли он? Не было ли нерационального падения производительности?

Что проще?
_Bers вне форума Ответить с цитированием
Старый 25.12.2011, 16:40   #74
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Всегда думал, что стек выделяется потоку в единственном экземпляре один раз при создании, а дальше идут только прыжки по стеку.
Вход в тело функции - прыжок.
выход - прыжок.
ну то что вы имели в виду под прыжками, мы сейчас назвали резервированием стека(оно же создание кадра стека).
оно же выделение памяти в стеке.
Цитата:
А если "не в общем то", а конкретно вообще не упадёт?
не значительно.
но такие оптимизации проводят все компиляторы современные.
Цитата:
Что проще?
Код:
{
    char c;
    int i;
    //etc
    for(i=0;i<H;i++)
    {
        //тело
    }
}
ок пишите так
Цитата:
Сама память уже не выделяется и не удаляется
кстати, если копнуть глубже то выделение памяти возможно(но не освобождение).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.12.2011, 16:44   #75
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Всегда думал, что стек выделяется потоку в единственном экземпляре один раз при создании, а дальше идут только прыжки по стеку.
Вход в тело функции - прыжок.
выход - прыжок.

Сама память уже не выделяется и не удаляется
Прыжков по стеку не происходит, а меняется указатель на вершину стека. Я не говорил, что при входе в подпрограмму выделяется из кучи новый стек, я говорил о том, что при входе в подпрограмму, в стеке сразу выделяется кусок памяти под её переменные. Путём изменения указателя не вершину стека - sp (stack pointer).
Цитата:
А если "не в общем то", а конкретно вообще не упадёт?
вообще не упадёт, потому что выделения (изменения sp) памяти происходит только при входе в подпрограмму, при создании стекового фрейма (во всяком случае во всех тех компиляторах, которые я использовал, даже с отключёнными оптимизациями).
Цитата:
Программист на с++ не должен:
1. Уповать на компилятор.
2. Думать в терминах другого языка программирования.

Он должен решать задачи максимально эффективным способом на своём уровне, при помощи своего языка.

Вынеси переменную за тело цикла - и ни с кем не имей никаких проблем.

Оставь её в теле цикла - и беги учить ассемблер, что бы теперь следить за каждым компилятором, оптимизировал ли он? Не было ли нерационального падения производительности?
программист на C++ должен уже знать ассемблер, перед тем как садиться писать высокопроизводительные программы, должен знать свой компилятор и как наиболее эффективно написать код для него.

Последний раз редактировалось netrino; 25.12.2011 в 16:48.
netrino вне форума Ответить с цитированием
Старый 25.12.2011, 16:50   #76
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если бы оптимизации не было вообще, то было бы так между прочим, ибо конец блока
Вряд ли ) логичнее все же выглядело бы
Код:
sub esp, 4
L1:
   //тело цикла
   jmp L1
add esp,4
Хотя, конечно, такое поведение тоже можно обозвать оптимизацией. Вечная проблема нечетких определений )
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2011, 16:53   #77
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
программист на C++ должен уже знать ассемблер, перед тем как садиться писать высокопроизводительные программы, должен знать свой компилятор и как наиболее эффективно написать код для него.

А ну да, привязываться и запиливаться под конкретный камень/ось/компилятор. Ну-ну.

И там, где проще тупо создать переменную за циклом, и не париться - проявлять чудеса академических знаний и по части компилятора, и по части ассмы, и по части камня, да? Это у вас такой подход к программированию на с++
_Bers вне форума Ответить с цитированием
Старый 25.12.2011, 17:00   #78
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
А ну да, привязываться и запиливаться под конкретный камень/ось/компилятор. Ну-ну.

И там, где проще тупо создать переменную за циклом, и не париться - проявлять чудеса академических знаний и по части компилятора, и по части ассмы, и по части камня, да? Это у вас такой подход к программированию на с++
Если мы говорим о высокопроизводительных программах, то безусловно это так. Необходимо знать как написать код, чтобы компилятор его максимально оптимизировал, произвёл векторизацию, разворот циклов и т.п.
Ну а если речь идёт о простом прикладном программировании, то даже если вдруг компилятор сдуру будет выделять память каждый раз при входе в область видимости цикла, то это будет микрооптимизацией в контексте задачи и не даст никакого прироста производительности.
netrino вне форума Ответить с цитированием
Старый 25.12.2011, 17:05   #79
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Программист на с++ не должен:
1. Уповать на компилятор.
2. Думать в терминах другого языка программирования.
В первую очередь программист на C++ (да и на любом другом языке) должен писать код так, чтобы его было приятно читать. Ты же не будешь спорить с тем, что если переменная объявлена рядом с местом ее использования - это выглядит логичнее, чем pascal-style куча переменных в одном месте?

Во вторую очередь, если программист на C++ хочет добиться максимальной производительности от конкретного куска кода - он должен хорошо представлять принцип работы своего компилятора и особенности той архитектуры, под которую пишет. В особенности архитектуры, в частности, входит и хотя бы базовое знание ассемблера. Да, и никуда от этого не деться - простым механическим применением заученных догм вроде "всегда выноси переменные из цикла" тут не обойтись.
К тому же границы применимости всех пэтих вещей подробно описаны у того же Саттера, например. И хороший программист на C++ даже совсем без знания ассемблера (если допустить гипотетическую вероятность существования такового) должен их чувствовать.
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2011, 17:06   #80
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
логичнее все же выглядело бы
я тоже самое написал, но на плюсах.
Цитата:
И там, где проще тупо создать переменную за циклом, и не париться
а как же минимальная область видимости переменной?
любой компилятор переработает этот цикл.
вообще если хотите, можете вынести в for-init секцию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PopupMenu со мной не дружит Жигилий_Ульяна Компоненты Delphi 5 25.12.2008 11:04
проблемы с select или со мной... smoke888 JavaScript, Ajax 2 23.09.2008 19:02