|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 25, 2004 12:09:41 не только, в том числе и в приплюснутых компиляторах для вычислениях this'а в сложных случаях множественного наследования. А можно объяснить чуточку по подробнее или дать ссылку где можно прочитать про это? |
|
|
Дата: Май 25, 2004 14:52:39 есть хорошая книга "Дизайн и эволюция языка Си++" от Страустрапа, глава 12.4: множественное наследование - модель размещения объекта в памяти. у объекта может быть несколько таблиц виртуальных функций и при вызове f1() для объекта X нужно чтобы указатель this был направлен на подобъект x объекта X, тогда как при вызове f2() для объекта X нужно, чтобы this указывал на весь объект C. для этого применяются различные техники: коррекция this через дельту указателей на X и x, самодифицирующийся код и шлюзование (think) - передача управления на код, корректирующий this. |
|
|
Дата: Май 25, 2004 15:41:03 kaspersky коррекция this через дельту указателей на X и x, самодифицирующийся код и шлюзование (think) - передача управления на код, корректирующий this Хотелось бы увидеть пример такого самомодифицируещегося кода. |
|
|
Дата: Май 25, 2004 15:46:44 за примером нужно обращаться к компилятору (только бы вспоминть какие компиляторы и при каких обстоятельствах генерируют самомодифицирующийся код)... |
|
|
Дата: Май 25, 2004 17:41:12 для этого применяются различные техники: ... Я видел "генерирование" кода на лету (в некотором буфере), но не его самомодификацию. Или это одно и тоже? Imho, нет, т.к. генерирование на лету не требует никаких издержек при выполнении (код сначала целиком генерируется, а потом целиком исполняется). А пример именно самомодификации хотелось бы увидеть... |
|
|
Дата: Май 25, 2004 18:13:19 а че там смотреть... есть у тебя например jmp relofs на процедуру, которая считает нечто через fpu инструкции. а если проц поддерживает sse, ты впариваешь туда адрес процедуры, которая делает то-же самое, только через sse инструкции, предварительно установив атрибуты защиты страниц в секции кода. вот и вся "самомодификация" З.Ы. во всяких жутко оптимизированных мат. либах это нормальное явление |
|
|
Дата: Май 25, 2004 18:24:44 > Я видел "генерирование" кода на лету (в некотором > буфере), но не его самомодификацию. > Или это одно и тоже? Imho, нет, нет конечно, это разновидность шлюза (часто он генерируется динамически и забрасывается на стек, но это тоже издежки). подлинно самомодифицирующийся код модифицирует именно машинный код. в живых программах мне такое попадалось лишь несколько раз, да и то под дос, но знающие люди мне говорили, что такой прием на самом деле не редкость. кто-то с ним сталикается чаще, кто-то реже, но он есть ;) |
|
|
Дата: Май 25, 2004 18:30:48 kaspersky - видишь волк? - нет. - но он есть ;) |
|
|
Дата: Май 25, 2004 20:35:18 вообще-то в оригинале там про сурка было ;) |
|
|
Дата: Май 26, 2004 05:29:52 > в живых программах мне такое попадалось лишь несколько раз, да и то под дос Чем дальше смотреть в сторону прошлого - тем больше будет таких примеров imho. На Z80 это было совершенно обычным делом. Ведь там не было кеша :) |
|
|
Дата: Май 26, 2004 10:04:35 да, но на Z80 не было Си++ ;) а мы про него говорим ;) |
|
|
Дата: Май 27, 2004 09:57:54 · Поправил: S_T_A_S_ Причём здесь С++? Тем более без примеров. Топик про самомодифицирующийся код. Самый примитивный пример для зилога: foo: CALL bar ....... bar: LD HL, bar2 LD (foo+1), HL ....... RET bar2: LD HL, bar LD (foo+1), HL ....... RETКонечный автомат, если я не ошибаюсь. Кто так будет делать сейчас? И почему - не будет ?? ЗЫ Суслик может и есть, но я его не вижу. |
|
|
Дата: Май 27, 2004 12:02:33 > Конечный автомат, если я не ошибаюсь. > Кто так будет делать сейчас? И почему - не будет ?? не будет потом, что модифицировать аргумент call [xxx] намного проще, тем более что это можно реализовать на ЯВУ без извратов > Причём здесь С++? Тем более без примеров. потому что разговор защел о Си++ и технике вызова виртуальных функций со сложным наследованием, чего на Z80 машнах никогда не было и уже не будет ;) |
|
|
Дата: Май 28, 2004 05:51:33 > модифицировать аргумент call [xxx] намного проще Какая разница какую ячейку менять? Мой пример - простая экономия памяти :). Но так не будут делать т.к. это отрицательно скажется на производительности. Пример Max с MMX / SSE - другое дело. Изменения происходят один раз во время инициализации программы. Но во время выполнения нет постоянной модификации кода. > разговор защел о Си++ и технике вызова виртуальных функций со сложным наследованием Раз уж разговор зашёл, то хотелось бы увидеть реальный пример кода. А то у меня с фантазией проблемы :( |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.131 |