|
|
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Раньше активно использовал локальные функции в качестве Callback-ов. Типа: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Эффективно реализуется с помощью пары аsm-вставок, не суть. При портировании на Linux нупрямую сконветировавть не удается. Возможна более-менее равноценная замена, типа: Код: pascal 1. 2. 3. 4. 5. 6. 7. Но напрягает ее неэффективность. Создается полноценное замыкание, аллокация памяти, захват стека, все дела. Но по сути - ничего этого не нужно, нужен только Callback с доступом к внешнему stack-frame'у. Any idea? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 13:20 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Но напрягает ее неэффективность. Умозрительная или фактическая? Если первое то забить, если второе то отрефакторить на перечислитель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 15:36 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Я, вроде, придумал решение, которое позволяет сохранить старый синтаксис и для LLVM компилятора. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Если вынести ifdef в include, то все ограничивается одной строкой в каждой такой функции: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вроде, все тесты проходит. Будем наблюдать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 15:39 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Реализация Each, если кому интересно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 15:52 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Я не совсем понимаю, почему нельзя сделать так? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. и соответственно вызов не любой платформе Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 16:28 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Я не совсем понимаю, почему нельзя сделать так? это слишком просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 16:33 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Потому что это не скомпилируется? Локальные процедуры не совпадают по формату вызова с глобальными. Они получают еще один неявный параметр - указатель на stack frame внешней процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 16:35 |
|
||
|
Эффективная реализация локальных Callback-ов?
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov, 1й вариант из самого первого комментария скомпилируется и под win64, но не будет работать (в отличии от win32). Но достаточно вынести procedure LocIterator за пределы procedure SomeProc (т.е. повысив область видимости), как такой callback начинает работать. Возможно под Linux так же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2020, 17:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39974931&tid=2038183]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 479ms |

| 0 / 0 |
