Re[6]: А почему бы не сделать стек еще умнее?
От: _smit Россия  
Дата: 15.11.16 13:38
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, _smit, Вы писали:

_>>...действует в рамках вызова функций. Gcc поступает также, т.н. "Calling Convention".


PD>Calling convention — это другое. Это правила передачи параметров функции (слева направо(сейчас нет уже, было в Win16) или справа налево, через стек и/или регистры, кто очищает стек при выходе (вызывающая или вызываемая). К отведению места в стеке под локальные переменные функции это отношения не имеет.


верно, посмотрел определение "Calling Convention", так и есть. Изучал организацию стека MIPS по документам, подобным "MIPS Calling Convention" (https://acm.sjtu.edu.cn/w/images/d/db/MIPSCallingConventionsSummary.pdf) и др. (http://people.ee.duke.edu/~sorin/ece152/lectures/2.4-isa.pdf, http://www.cs.ucsb.edu/~franklin/154/Fall07/lectures/Lec5_handout.pdf), плюс требования к SSP, поэтому отложилось в голове, что размещение локальных переменных являлось частью соглашения о вызовах.
Re[8]: кстати
От: uzhas Ниоткуда  
Дата: 15.11.16 14:00
Оценка: -1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, uzhas, Вы писали:


U>>то есть компилятор может реюзать стековую память для других переменных, если время жизни предыдущих закончилось


PD>Думаю, что не может, а обязан.

в примере выше он может, но не обязан. тебе лишь бы поспорить ?

PD>Иначе объем памяти может возрасти в N раз без всякого смысла.

фраза без всякого смысла. мне тут испугаться числа N?
Re[9]: кстати
От: Pavel Dvorkin Россия  
Дата: 15.11.16 14:15
Оценка:
Здравствуйте, uzhas, Вы писали:

PD>>Думаю, что не может, а обязан.

U>в примере выше он может, но не обязан. тебе лишь бы поспорить ?

Да нет, просто тут стековый механизм выделения, а это его следствие.

PD>>Иначе объем памяти может возрасти в N раз без всякого смысла.

U>фраза без всякого смысла. мне тут испугаться числа N?

При достаточно большом размере локальных переменных и приличном N получить на ровном месте stack overflow там , где можно без него обойтись — пугаться бы я не стал, но высказался бы об авторах кода нелестно.
With best regards
Pavel Dvorkin
Re[10]: кстати
От: uzhas Ниоткуда  
Дата: 15.11.16 17:13
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

U>>в примере выше он может, но не обязан. тебе лишь бы поспорить ?


PD>Да нет, просто тут стековый механизм выделения, а это его следствие.


никакого следствия тут нет
смотрим сюда: http://rextester.com/WVP96955
clang не стал склеивать две стековые переменные и это его право
подобную оптимизацию компиляторы реализуют в силу своих возможностей
Re[11]: кстати
От: Pavel Dvorkin Россия  
Дата: 16.11.16 13:44
Оценка:
Здравствуйте, uzhas, Вы писали:

U>clang не стал склеивать две стековые переменные и это его право


Ты прав, а он неправ
With best regards
Pavel Dvorkin
Re[12]: кстати
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.11.16 21:40
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, uzhas, Вы писали:


U>>clang не стал склеивать две стековые переменные и это его право


PD>Ты прав, а он неправ


Ничего неправильного тут нет. Укладка p2 туда же, где p1, потребовала бы лишних телодвижений, в первую очередь, на зачистку стека после первого printf(). Лишняя команда манипуляции %esp стоила бы дороже, чем те 4 байта. Вот если бы их было 4000, скорее всего, сделали бы такую зачистку.
The God is real, unless declared integer.
Re[10]: кстати
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.11.16 21:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>Думаю, что не может, а обязан.

U>>в примере выше он может, но не обязан. тебе лишь бы поспорить ?

PD>Да нет, просто тут стековый механизм выделения, а это его следствие.


PD>>>Иначе объем памяти может возрасти в N раз без всякого смысла.

U>>фраза без всякого смысла. мне тут испугаться числа N?

PD>При достаточно большом размере локальных переменных и приличном N получить на ровном месте stack overflow там , где можно без него обойтись — пугаться бы я не стал, но высказался бы об авторах кода нелестно.


Меряют, скорее всего, не "в N раз", не разбираясь, что умножают на это N — а _на сколько_ возросла затрата.
The God is real, unless declared integer.
Re: А почему бы не сделать стек еще умнее?
От: T4r4sB Россия  
Дата: 22.11.16 16:58
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>т.е. все операторы new вызванные в методах этого объекта


В шарпике так и делается, а в крестах нормальные люди и так кучу лишний раз не дёргают.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: А почему бы не сделать стек еще умнее?
От: jazzer Россия Skype: enerjazzer
Дата: 22.11.16 18:08
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>фича для компилятора:

K>вот например передаем мы чтото или создаем локальную переменую, а почему бы если нет особых указаний, то все что будет динамически выделено этим и производными объектами не выделять тоже в стеке?
K>т.е. все операторы new вызванные в методах этого объекта, если нет особых указаний, будут аллокейтить в стеке
K>например при передаче строк, можно вообще тогда обойтись без обращения к куче

потому что
std::string h() { return std::string('a',1000); }
std::string g() { char x[10]; return h(); }
std::string f() { g(); char x[5000]; }

нарисуй на бумажке, что где должно храниться после каждого шага, и тебе все станет ясно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.