__ declspec (dllimport/dllexport) и наследование

Это зависит от того, что Вы делаете с изображением. imageNamed: метод действительно кэширует изображение, но во многих случаях это собирается помочь с использованием памяти. Например, при загрузке изображения 10 раз для отображения наряду с некоторым текстом в табличном представлении, UIImage только сохранит единственное представление того изображения в памяти вместо того, чтобы выделить 10 отдельных объектов. С другой стороны, если у Вас есть очень большое изображение, и Вы не снова используете его, Вы могли бы хотеть загрузить изображение из объекта данных удостовериться, что оно удалено из памяти, когда Вы сделаны.

, Если бы у Вас нет огромных изображений, я не волновался бы об этом. Если Вы не видите проблемы (и престижность за проверку Объектного Выделения вместо того, чтобы заблаговременно оптимизировать), я предпочел бы меньше строк кода незначительным улучшениям памяти.

5
задан Nicolas 12 August 2009 в 18:35
поделиться

3 ответа

Класс Derived не будет экспортирован вашей DLL. Классы не наследуют экспорт. Добавьте к этому DLLAPI.

Также обратите внимание, что члены класса по умолчанию имеют частный доступ, поэтому ни один из ваших методов не должен быть доступен. Однако я вижу, что в моем тесте экспортируется Base :: B (). Заголовок C ++ в коде, использующем DLL, будет сигнализировать об ошибке, но мне интересно, если бы вы изменили заголовок там, если бы вы могли обмануть его.

В любом случае, если вы действительно создали экземпляр Derived внутри своей DLL (через другую точку входа) , виртуальная таблица должна по-прежнему работать, поэтому, если вы это сделали:

Base* b = getTheDerived(); b->B();

, вы должны вызвать Derived :: B ().

поэтому ни один из ваших методов не должен быть доступен. Однако я вижу, что в моем тесте экспортируется Base :: B (). Заголовок C ++ в коде, использующем DLL, будет сигнализировать об ошибке, но мне интересно, если бы вы изменили заголовок там, если бы вы могли обмануть его.

В любом случае, если вы действительно создали экземпляр Derived внутри своей DLL (через другую точку входа) виртуальная таблица должна работать, поэтому, если вы это сделали:

Base* b = getTheDerived(); b->B();

, вы должны вызвать Derived :: B ().

поэтому ни один из ваших методов не должен быть доступен. Тем не менее, я вижу, что в моем тесте экспортируется Base :: B (). Заголовок C ++ в коде, использующем DLL, будет указывать на ошибку, но мне интересно, если вы изменили заголовок там, если бы вы могли его обмануть.

В любом случае, если вы действительно создали экземпляр Derived внутри своей DLL (через другую точку входа) , виртуальная таблица должна по-прежнему работать, поэтому, если вы это сделали:

Base* b = getTheDerived(); b->B();

, вы должны вызвать Derived :: B ().

4
ответ дан 14 December 2019 в 04:44
поделиться

Вы можете узнать из командной оболочки Visual Studio, набрав

link /dump /exports <yourdll>

. Если они экспортированы, вы увидите «украшенные имена» для функций. Чтобы увидеть их в удобочитаемом формате, скопируйте и вставьте один и выполните

undname <decorated name>
3
ответ дан 14 December 2019 в 04:44
поделиться

Нет, Derived не будет виден вне библиотеки DLL. Чтобы экспортировать производный класс, вам придется применить макрос DLLAPI также к производным классам.

1
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: