Re[6]: продолжение списка причин...
От: igna Россия  
Дата: 04.09.07 06:56
Оценка:
Здравствуйте, Erop, Вы писали:

E>6) Отложенная загрузка чего-то большого/очень редко нужного


Правда? А что, и сегодня это все еще актуально? Честно говоря думал, что и из exe-файла грузится только то, что используется.
Re[7]: New в процессе - delete в dll
От: dip_2000 Россия  
Дата: 04.09.07 07:06
Оценка:
Здравствуйте, Erop, Вы писали:

_>>при всем уважении, пункты 1 и 5 означают что оно потенциально будет иметь разные версии CRT. Автор утверждает обратное. И потом я не вижу противоречия между написанным мной и пунктами 1 и 5.

E>Вообще-то это проблема исключительно административная. Можно же для каждого проекта собирать свой билд этой dll. Ну или, хотя бы, для каждого используемого компилятора + CRT
а если это просто библиотека ? И вы ее поставляете для использования другими компаниями в их проектах?


_>>3 — явно подмножество остальных пунктов

E>Ну интересно бы узнать каких именно Скажем из какого пунтка следует то, что все статические объекты dll строятся до статических объектов её клиента (про статической линковке)
2, 4, 5
вобще я не совсем понял вашего скачка от разбиения на модули(инкапсуляции, разделения труда итд), к статическим объектам в dll. Да и еще исключительно в статически линкуемой dll(не видел такого ограничения в этом топике). Но в целом предлагаю на этом не "тормозиться" Тк это явно мало относится уже к топику
Re[7]: продолжение списка причин...
От: Erop Россия  
Дата: 04.09.07 07:07
Оценка:
Здравствуйте, igna, Вы писали:

I>Правда? А что, и сегодня это все еще актуально? Честно говоря думал, что и из exe-файла грузится только то, что используется.


Это если тебе адресного простанства не жалко Да и настройка адресов время занимает заметное.
Ну и потом есть ещё и инициализация. В каком-то смысле удобнее иметь загруженный код уже и инициализированным. Мэнеджмент проще.
Скажем грузишь ты спеллеро в ворд. Он или грузится или нет. Если грузится, то значит словари уже нашёл...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: New в процессе - delete в dll
От: Erop Россия  
Дата: 04.09.07 07:14
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>а если это просто библиотека ? И вы ее поставляете для использования другими компаниями в их проектах?

Ну тогда не стоит закладываться на то, что сквозь границу библиотеки можно передавать исключения, владение блоками new|delete и т. п. Либо точно это специфицировать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: New в процессе - delete в dll
От: minorlogic Украина  
Дата: 04.09.07 07:37
Оценка:
Здравствуйте, Erop, Вы писали:

E>Тгда уж и operator new и delete для этих же классов стоит перекрыть...

E>А то не поможет

Я не понял о чем идет речь.

я говорю об этом
http://www.rsdn.ru/forum/message/2440046.1.aspx
Автор: minorlogic
Дата: 10.04.07
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: New в процессе - delete в dll
От: Erop Россия  
Дата: 04.09.07 08:24
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>я говорю об этом

M>http://www.rsdn.ru/forum/message/2440046.1.aspx
Автор: minorlogic
Дата: 10.04.07


Я примепрно об этом же.
Гарантии вроде как есть только для операторов new/delete перекрытых в классе. То, что эффект распространаяется и на глобальные new/delete ИМХО, особенностьреализации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Ответ есть ещё и тут
От: Erop Россия  
Дата: 04.09.07 09:04
Оценка:
Здравствуйте, minorlogic, Вы писали:

E>>Тгда уж и operator new и delete для этих же классов стоит перекрыть...

M>Я не понял о чем идет речь.
M>http://www.rsdn.ru/forum/message/2440046.1.aspx
Автор: minorlogic
Дата: 10.04.07


мой ответ
Автор: Erop
Дата: 04.09.07
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: New в процессе - delete в dll
От: Wifer http://gamedev.by
Дата: 07.09.07 12:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Могут ли быть какие-нибуть проблемы в этом случае?


Да будут проблемы, и очень много но всё решается редиректом (new и delete в exe,dll) в какой-либо модуль, чтобы было одно адресное пространство, иначе есть риск одинаковой адресации обьектов, в нормальных проектах создается модуль называемый менеджером памяти, каторый за это всё и отвечает.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re: New в процессе - delete в dll
От: Пётр Седов Россия  
Дата: 07.09.07 14:23
Оценка: +1
Здравствуйте, Аноним.
По-моему, тема ветки не очень корректно сформулирована, правильнее так: «new в exe — delete в DLL».
Как уже писали, разные модули (модуль — это exe или DLL в рамках Windows-процесса, модуль идентифицируется значением типа HINSTANCE (он же HMODULE)) могут пользоваться разными C++ heap-ами. То есть может получиться так, что в exe глобальный new берёт память у одного C++ heap-а, а в DLL глобальный delete возвращает память другому C++ heap-у. На эту тему есть страшная картинка здесь
Автор: Пётр Седов
Дата: 26.06.07
(86 KB). Там про malloc/free, но всё аналогично.
Пётр Седов (ушёл с RSDN)
Re[2]: New в процессе - delete в dll
От: Пётр Седов Россия  
Дата: 07.09.07 15:19
Оценка:
Здравствуйте, Wifer, Вы писали:

W>Да будут проблемы, и очень много но всё решается редиректом (new и delete в exe,dll) в какой-либо модуль, чтобы было одно адресное пространство,

В рамках Windows-процесса у всех модулей (exe и DLL-и) и так общее виртуальное адресное пространство, для этого не надо никаких redirect-ов делать.

W>иначе есть риск одинаковой адресации обьектов,

Что такое «одинаковая адресация объектов»? И почему это риск?

W>в нормальных проектах создается модуль называемый менеджером памяти, каторый за это всё и отвечает.

Необязательно создавать свой DLL, можно использовать готовый, например:
* msvcrt.dll, функции malloc, free.
* kernel32.dll, функции GetProcessHeap, HeapAlloc, HeapFree.
* ole32.dll, функции CoTaskMemAlloc, CoTaskMemFree (Awaken уже написал здесь
Автор: Awaken
Дата: 03.09.07
).

Кстати, чтобы предотвратить путаницу. Слово «модуль» используется в двух значениях:
* Exe или DLL в рамках Windows-процесса. Именно это я имею в виду под словом «модуль».
* Unit, то есть пара .h-файл (заголовочный файл) и .cpp-файл. Имеется близкое понятие «translation unit» — это результат обработки .cpp-файла C++-препроцессором.
Пётр Седов (ушёл с RSDN)
Re[3]: New в процессе - delete в dll
От: Wifer http://gamedev.by
Дата: 07.09.07 16:23
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>Здравствуйте, Wifer, Вы писали:


W>>Да будут проблемы, и очень много но всё решается редиректом (new и delete в exe,dll) в какой-либо модуль, чтобы было одно адресное пространство,

ПС>В рамках Windows-процесса у всех модулей (exe и DLL-и) и так общее виртуальное адресное пространство, для этого не надо никаких redirect-ов делать.
Ну доэтого я считал что ДЛЛ подгружается в свое адресно протсранство, тк это собственно отдельный процесс, и то что ползание одмин процессом по адресам другого неверно не самый лучший вариант, и виндовс со мной согласна )

W>>иначе есть риск одинаковой адресации обьектов,

ПС>Что такое «одинаковая адресация объектов»? И почему это риск?
По теории у 2х процессов может по одному и томуже адресу находится различная информация
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[2]: New в процессе - delete в dll
От: Аноним  
Дата: 07.09.07 16:38
Оценка: +1
W>Да будут проблемы, и очень много но всё решается редиректом (new и delete в exe,dll) в какой-либо модуль, чтобы было одно адресное пространство, иначе есть риск одинаковой адресации обьектов, в нормальных проектах создается модуль называемый менеджером памяти, каторый за это всё и отвечает.
Причем тут адресное пространство? Просто new/delete это не функции операционной системы. А функции рантайма. А рантайм у каждого модуля может быть свой. МОжет быть и одинаковый и разнух модулей, но на это нельзя закладываться. Как и на то что new/delete никогда не будут переопределены для данного кода.
Re[3]: New в процессе - delete в dll
От: Wifer http://gamedev.by
Дата: 07.09.07 16:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> Как и на то что new/delete никогда не будут переопределены для данного кода.

А что мне помешает это сделать ?, ты программист — должен следить, тыже не пытаешься вызвать функции класса по нулевому указателю.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[4]: New в процессе - delete в dll
От: Пётр Седов Россия  
Дата: 07.09.07 20:19
Оценка:
Здравствуйте, Wifer, Вы писали:

W>Ну доэтого я считал что ДЛЛ подгружается в свое адресно протсранство, тк это собственно отдельный процесс,

Загруженная DLL — это не отдельный процесс, это модуль в рамках процесса.

W>и то что ползание одмин процессом по адресам другого неверно не самый лучший вариант, и виндовс со мной согласна )

В общем случае читать/писать память другого процесса с помощью C++-указателя не получится (хотя если разделяемая память, то можно, это реализуется с помощью file-mapping object). Для этого надо использовать WinAPI-шные функции ReadProcessMemory и WriteProcessMemory, отладчики так поступают.

W>По теории у 2х процессов может по одному и томуже адресу находится различная информация

Да, это и на практике так. Но так как у каждого процесса — своё изолированное виртуальное адресное пространство, то обычно конфликтов не возникает.

P. S. Советую почитать книгу Джеффри Рихтера «Windows для профессионалов»
Автор(ы): Джеффри Рихтер
Это издание — практически новая книга, посвещенная программированию серьезных приложений на Microsoft Visual C++ в операционных системах Windows 2000 (32- и 64-разрядных версиях) и Windows 98 с использованием функций Windows API. Состоит из 27 глав, двух приложений и предметного указателя. Гораздо глубже, чем в предыдущих изданиях рассматриваются такие темы, как взаимодействие с операционной системой библиотеки C/C++, программирование DLL и оптимизация кода, описываются новые механизмы и функции, появившиеся в Windows 2000, и приводится информация, специфическая для 64-разрядной Windows 2000. В этом издании автор, перейдя с языка C на C++, переработал все программы-примеры и представил ряд новых приложений, например ProcessInfo и LISWatch. Также появились совершенно новые материалы: выравнивание данных, привязка потоков к процессорам, кэш-линии процессоров, архитектура NUMA, перехват API-вызовов и др. Книга предназначена профессиональным программистам, владеющим языком C/C++ и имеющим опыт разработки Windows-приложений. Прилагаемый компакт-диск содержит все программы из книги (исходный код и исполняемые файлы для процессоров x86, IA-64 и Alpha).
. Там описаны механизмы, предоставляемые Windows kernel-ом, в том числе DLL.
Пётр Седов (ушёл с RSDN)
Re[4]: New в процессе - delete в dll
От: Аноним  
Дата: 07.09.07 22:41
Оценка:
А>> Как и на то что new/delete никогда не будут переопределены для данного кода.
W>А что мне помешает это сделать ?, ты программист — должен следить, тыже не пытаешься вызвать функции класса по нулевому указателю.
Фишка в том что программист часто не один, а штук 100. И код должен минимально зависеть от "окружающих условий" дабы оставаться стабильным в течении времени жизни проекта.
Re[5]: New в процессе - delete в dll
От: Wifer http://gamedev.by
Дата: 10.09.07 08:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>> Как и на то что new/delete никогда не будут переопределены для данного кода.

W>>А что мне помешает это сделать ?, ты программист — должен следить, тыже не пытаешься вызвать функции класса по нулевому указателю.
А>Фишка в том что программист часто не один, а штук 100. И код должен минимально зависеть от "окружающих условий" дабы оставаться стабильным в течении времени жизни проекта.
Но допустим, что их много, и что, значит необходима архитектура такая чтобы писали правильно, а не как вздумается, но это уже совсем другая история.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[5]: New в процессе - delete в dll
От: minorlogic Украина  
Дата: 12.09.07 05:28
Оценка:
Здравствуйте, Erop, Вы писали:

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


M>>я говорю об этом

M>>http://www.rsdn.ru/forum/message/2440046.1.aspx
Автор: minorlogic
Дата: 10.04.07


E>Я примепрно об этом же.

E>Гарантии вроде как есть только для операторов new/delete перекрытых в классе. То, что эффект распространаяется и на глобальные new/delete ИМХО, особенностьреализации...

Я и на это отвечал, что если это особенность реализации то по другому реализовать то и не возможно. И объяснил почему. Очень интересно посмотреть на компилятор который делает по другому, в стандарте можно покопаться , наверняка это жестко зафиксированно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[6]: New в процессе - delete в dll
От: Erop Россия  
Дата: 12.09.07 07:56
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Я и на это отвечал, что если это особенность реализации то по другому реализовать то и не возможно. И объяснил почему. Очень интересно посмотреть на компилятор который делает по другому, в стандарте можно покопаться , наверняка это жестко зафиксированно.


1) АФАИК в стандарте это не зафиксированно,например потому, что там вообще нет понятия DLL и есть специальнеый раздел, где подчёркивают, что глобальный new/delete должен быть один, ну и вообще не зафиксировано это в стандарте. Там наоборот говорят, что если глобальных операторов несколько, то программа некорректна.

2) Компилятор, который делает по другому тебе уже приводили
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.