Форум программистов, компьютерный форум CyberForum.ru

Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с файлом типа fstream http://www.cyberforum.ru/cpp-beginners/thread1091503.html
Пишем несложный код: fstream file("Test.txt",ios_base::in|ios_base::app); int cnt = 0; while (cnt < 3) { cerr << char(file.get()); cnt++; }
C++ Эмулятор. На С, С++ Здравствуйте уважаемые читатели форума! У меня такой вопрос: (СРАЗУ ПРЕДУПРЕЖДАЮ Я НЕ ОЧЕНЬ ХОРОШО РАЗБИРАЮСЬ ПОКА В ЭТОМ ТАК ЧТО ОЧЕНЬ МНОГОЕ ИЗ МОИХ СЛОВ МОЖЕТ БЫТЬ ЖУТКИМ ....) В качестве зачетного задания преподаватель задал написать эмулятор процессора, (ну вначале придумать архитектуру, и написать эмулятор этого). Шаблон он дал, там был примитивный ассемблер, написанный на перле. И на С... http://www.cyberforum.ru/cpp-beginners/thread1091494.html
C++ Использование стороннего CSP. Шифрование в программе
Снова обращаюсь к гуру программирования. Возникла ещё одна проблема, причём уже давно. Некоторые пользователи жалуются на невозможность использования программы по причине НЕсохранения их данных в форме ввода. Хотя автосохранение стоит. На данный момент в программе используется виндовый CryptAcquireContext для шифрования введённых данных (логин и пароль для доступа к персональному кабинету...
Я создаю утечки памяти ! C++
Нет, я не хочу похвастаться этим. Я любитель использовать быстрые решение для того чтобы реализовать алгоритм или проверить "чтобы работало", но как известно нет ничего более вечного, чем временное... ... время идет, а код остается :wall: Образец:HTEXTURE tex; tex = hge->Load_Texture("texture.png"); hgeSprite* sprite = new hgeSprite(tex,0,0,50,50); sprite->Render(); //Play delete sprite;...
C++ Каким образом идет поиск слов в кавычках? http://www.cyberforum.ru/cpp-beginners/thread1091483.html
Доброго времени суток! Вот вся программа #include <fstream> #include <iostream> #include <string> int main() { std::ofstream ofs("test.txt");
C++ Умножить матрицу 10х10 на вектор из 10 элементов дана матрица:10*10.умножить ее на вектор 10.помогите пожалуйста...очень нужно подробнее

Показать сообщение отдельно
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
18.02.2014, 21:57  [ТС]     Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW)
Цитата Сообщение от DrOffset Посмотреть сообщение
Наконец-то Все-таки все тоже самое, что в последнем сообщении было написано в первом.
Соглашусь, но разве не для того форум и существует, чтобы чисто и честно, по-товарищески объяснить? Это вообще философский вопрос. Всё написано в книгах/учебниках. И всё написано правильно. А вот поди ж ты- откуда берутся двоечники (лентяев не берём в расчёт)? Есть такой феномен как непонимание, и никуда от него не деться

Цитата Сообщение от DrOffset Посмотреть сообщение
Не так. Таблица импорта заполняется фактическими адресами при старте программы.
Действительно, заполняется. И этот адрес используется при вызове функции, то есть у меня в отладчике так:

Assembler
1
2
mov eax, [адрес в таблице импорта, по которому лежит адрес функции]
call eax
Вот моё заблуждение. Я думал, что будет так:
Assembler
1
2
mov eax, [чётко прописанный адрес]
call eax

Не по теме:

...Откуда взялся "чётко прописанный адрес"? Ну, когда мы компильнули экзешник с модификатором __declspec(dllimport), вот компилятор его и прописал тогда чётко по месту, что называется. Но теперь, я вижу, это не так.

Соответсвующее поле сначала занято RVA имени функции, а при загрузке в память загрузчик прописывает туда её адрес, прямо как по цитатному:
заполняется загрузчиком перед запуском программы и до заполнения адресами функций содержит RVA имен этих функций в таблице просмотра импорта.
К слову, я это примерно знал, поизучав "От зелёного к красному."

Не по теме:


Кстати, я только щас понял, почему не должно быть чётко прописанных адресов в экзешнике- *dll-ки могут грузиться по разным адресам и адреса вызываемых функций будут разными.



+++++++++++++++++++++++++++++++++++++++++++++

Тут вопросов нет. Вопрос возникает совершено не там, откуда ждали. Смотрите. Если мы компилим функцию с модификатором __declspec(dllimport), загрузчик во время загрузки ищет адрес этой функции и его использует. А если компилим БЕЗ __declspec(dllimport), загрузчик... делает то же самое, только использует адрес по-другому. Но по большому счёту, вся-то и сложность и разница в поведении по-разному скомпиленных экзешников должна заключаться в том, КОГДА В ЭКЗЕШНИКЕ СТАНЕТ ИЗВЕСТЕН АДРЕС ФУНКЦИИ

И если адрес функции в ОБОИХ СЛУЧАЯХ становится известным только при загрузке программы в память, тогда мы В ОБОИХ случаях ("с" и "без" __declspec(dllimport)) можем использовать более эффективный код, а именно:

Assembler
1
2
mov eax, [адрес в таблице импорта, по которому лежит адрес функции]
call eax
А на самом деле компилятор без __declspec(dllimport) генерит такой код: добавляет лишний прыжок

Assembler
1
2
call 0x4000000
4000000: jmp DWORD PTR __imp_func1 //вот этот лишний прыжок
Когда мог превосходно сгенерить код, который я написал выше. Я так понимаю, он эффективнее прыжка, и это же написано в msdn.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru