|
|
  |
Одна процедура - два имени, фича, при создании библиотек. |
|
|
|
Mar 9 2008, 23:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
При создании библиотек (для собственных нужд) столкнулся с проблемкой. Представьте что делаются две библиотеки для одной и той же задачи. Например, софтовое исполнение и аппаратное. Соответственно все подпрограммы делаются с одинаковыми именами. Для того, чтобы вызывающая прога не видела разницы. Не знала вообще что за библиотека подсунута. В одной из библиотек есть 2 ф-ции. Код void a(int x, int y); void b(int x, int y); В другой библиотеке обе ф-ции выполняются с помощью одной, поэтому в реализации написано так Код void b(int x, int y) { a(x,y); } Компилятор при этом честно генерит: Код b: rcall a ret И никакая оптимизация не помогает. Макроопределениями пользоваться нехочу. Как сделать чтобы компилятор вместо вызова одной подставлял обращение к другой. Фактически, чтобы он сделал бы две метки (при компиляции программы) на одну процедуру?
|
|
|
|
|
Mar 10 2008, 08:40
|

山伏
    
Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294

|
Цитата(rezident @ Mar 10 2008, 02:02)  Пользуйтесь вызовом функции по указателю. Чтобы вызвать ту или другую функцию достаточно сменить значение указателя. P.S. правда этот способ ведет к небольшому увеличению расхода памяти, т.к. для указателя нужна переменная. Стойте, я в этом не разобрался и для себя хочу уяснить, это же не C++ и расход будет далеко не только на указатель. А функция альтернативная где будет лежать? Если есть массив указателей и обращение только к одной из них поймет ли компилятор, что вторую не нужно помещать во флешь? Даже если в программе обращение только к одной. А если и поймет - то каждый ли? Где это стандартизированно? To: SasaVitebskпо-моему Страуструп сказал, что внутри С++ живет особый язык которым и нужно пользоваться, т.е. не сочетать все его механизмы как попало, ибо это далеко не то, что заложил в него его создатель. Так и к C это подходит. Зачем так усложнять простые вопросы? Я бы пользовался препроцессором. Ну а может Вам применить стандартные шаблоны С++ - это вобщем-то то что Вы хотите, только в нужном месте и в нужное время. Кстати, помнится когда-то GCC C++ генерил сначала кодс C, вот интересно как там выглядели шаблоны. Может это можно найти в каких-то старинных манускриптах по GCC.
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Mar 10 2008, 11:13
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(SasaVitebsk @ Mar 10 2008, 01:40)  При создании библиотек (для собственных нужд) столкнулся с проблемкой.... Немного не понятно, вы хотите, чтобы обе библиотеки одновременно присутствовали во флеши и выбирались софтовым переключателем или на этапе линковки подставлялась одна из двух? Цитата(DRUID3 @ Mar 10 2008, 10:40)  Если есть массив указателей и обращение только к одной из них поймет ли компилятор, что вторую не нужно помещать во флешь? Даже если в программе обращение только к одной. А если и поймет - то каждый ли? Где это ? Стандартизированно это или нет не знаю, но обычно хороший компилятор не линкует те модули, к которым нет обращений. Наоборот, всегда есть расширения, которые позволяют принудительно прилинковать такие модули. Например в ИАР это: __root
|
|
|
|
|
Mar 14 2008, 20:23
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Baser @ Mar 10 2008, 15:13)  Немного не понятно, вы хотите, чтобы обе библиотеки одновременно присутствовали во флеши и выбирались софтовым переключателем или на этапе линковки подставлялась одна из двух? Всё проще. Представляем что есть несколько процедур вызываемых из головы А В С Д Программа в голове написана и работает. При чём не имеет значения какую именно библиотеку я подключу. Реализации одинаковы. Теперь о библиотеках. В одной библиотеке Полностью реализованы А,В,Д а функция С ничем не отличается от B Дабы сохранить совместимость я пишу void C(void) { B(); } И компилятор честно компилит мне C: rcall B ret Мне это не совсем понятно. На асме я бы сделал следующим образом С: B: ..... ret Ну и конструкция rcall ret тоже вызывает у меня непонятки. Я бы на асме написал rjmp Включена максимальная оптимизация по скорости! Соптимизировать такие участки - это же пару пустяков и реальный выигрыш. С чем это связано?
|
|
|
|
|
Mar 14 2008, 21:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(SasaVitebsk @ Mar 10 2008, 02:40)  Макроопределениями пользоваться нехочу. Совершенно зря, для 'C', это совершенно нормальное, естественное и правильное решение. Код void aa(int x, int y); void bb(int x, int y);
#define a(x, y) aa( (x), (y) ) #define b(x, y) aa( (x), (y) ) Какие проблемы?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 14 2008, 22:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SasaVitebsk @ Mar 14 2008, 22:23)  И компилятор честно компилит мне C: rcall B ret
Мне это не совсем понятно. На асме я бы сделал следующим образом
С: B: ..... ret Попробуйте все же линкеру определить новый символ и присвоить ему адрес имеющейся процедуры, добаваив в скрипт или командную строку -DC=B. Вы получите именно желаемое - метку С с таким же адресом, что и B. Препроцессор, я так понимаю, вам не нравится потому что хотите подключать к проекту уже скомпилированные библиотеки? Насколько мне известно, многие, кто пытался идти таким путем, приходили в конце концов к включению исходников библиотеки в проект. А в борьбе с путаницой хорошо помогает система контроля версий (svn, bazaar, cvs и т.д.)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 15 2008, 22:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Сергей Борщ @ Mar 15 2008, 02:34)  Препроцессор, я так понимаю, вам не нравится потому что хотите подключать к проекту уже скомпилированные библиотеки?  Да нет. Просто не додумался до варианта, предложенного zltigo.  А представлял вариант, предложенный Baser. Он - не подходит. Спасибо также и вам, Сергей Борщ. Возможно где-то такое решение мне пригодится. Короче на один вопрос, сразу несколько готовых решений. Спасибо большое.
|
|
|
|
|
Mar 18 2008, 07:21
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(SasaVitebsk @ Mar 10 2008, 02:40)  В другой библиотеке обе ф-ции выполняются с помощью одной, поэтому в реализации написано так Код void b(int x, int y) { a(x,y); } Компилятор при этом честно генерит: Код b: rcall a ret И никакая оптимизация не помогает. Макроопределениями пользоваться нехочу. Как сделать чтобы компилятор вместо вызова одной подставлял обращение к другой. Фактически, чтобы он сделал бы две метки (при компиляции программы) на одну процедуру? Разместите реализацию b в заголовочном файле и оптимизатор должен справиться. Когда b станет большая - ее оттуда можно будет убрать. PS Если бы была глобальная оптимизация, то такое само бы получилось, но она есть далеко не у всех.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|