powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / С++ Class Builder, Увеличение производительности строковых функций
9 сообщений из 34, страница 2 из 2
С++ Class Builder, Увеличение производительности строковых функций
    #34427554
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineНо возникает ряд вопросов с резервированием памяти для возврата результата из функции DLL. Эти вопросы решаются путем дополнительных вызовов функций DLL, которых хотелось бы избежать. (Других путей не нашел, а они есть? :) )

Через PBNI можно в один вызов, но ИМХО будет медленнее чем 2 external (не проверял).

Вот я и задумался о том, что мне немного не хватает вызовов просто одиночных функций, хотелось бы чтобы можно было:
1. создать объект
2. зарядить переменные
3. вызвать обработку, или несколько обработок
4. забрать значение переменных (результат)
5. корректно разрушить объект и освободить память

Дальше думаю поковыряться с классами и методами в с++, может быть это поможет избежать дублирования вызовов функций.
Я вот так делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
//CTest.cpp
#define DLLEXPORT __declspec(dllexport)
#define PBCALL __stdcall
class CTest {
public: 
	DLLEXPORT static CTest* PBCALL makeInstance() {
		return new CTest();
	}
	// 1  вариант
	DLLEXPORT int PBCALL method1(int arg) {
		return arg;
	}
	//  2  вариант
	DLLEXPORT static int PBCALL method2_p(CTest* instance, int arg) {
		return instance->method2(arg);
	}
	int method2(int arg) {
		return arg;
	}

};

;mylib.def
LIBRARY 
EXPORTS
	makeInstance
	method1
	method2_p


/* external decls
Function ulong makeInstance() alias for "makeInstance" library "mylib.dll"
Function ulong method1(ulong instance, long arg) alias for "method1" library "mylib.dll"
Function ulong method2(ulong instance, long arg) alias for "method2_p" library "mylib.dll"
*/

Второй вариант позволяет применять виртуальные методы.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34427626
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Забыл про то, что при использовании .DEF для экспорта ф-й, __declspec(dllexport) не нужен.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34428163
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
...

Анатолий, пара вопросов:
1. Деструктора класса не вижу, как разрушаете объект?
2. Второй метод можно поместить вне класса?
3. Еще, не пробовал, но если определять несколько классов, то каким образом вызывать методы? с помощью второго метода, получится?

P.S. Сорри, за ламерские вопросы
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34428364
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineАнатолий, пара вопросов:
Не сходится с нижеследующим :)

1. Деструктора класса не вижу, как разрушаете объект?
2. Второй метод можно поместить вне класса?
3. Еще, не пробовал, но если определять несколько классов, то каким образом вызывать методы? с помощью второго метода, получится?


1) Аналогично:
Код: plaintext
1.
2.
3.
4.
5.
6.
class CTest {
public:
....
	DLLEXPORT void PBCALL destroy() {
		delete this;
	}

2) Да
3) Т.к. в DLL одно общее пространство имен, то придется вводить префиксы в именах экспортируемых ф-й
Это удобнее делать в .DEF переименованием символов чтобы не загромождать исходник С++ ненужными техническими деталями:


Код: plaintext
1.
2.
3.
4.
5.
;mylib.def
LIBRARY 
EXPORTS
...
     CTest_destroy = ?destroy@CTest@@SAXXZ

PS. Кстати насчет ненужности DLLEXPORT я погорячился. Почему то не всегда без него символ для .DEF определяется (VC6).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
С++ Class Builder, Увеличение производительности строковых функций
    #39580234
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky...
Я вот так делаю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//CTest.cpp
#define DLLEXPORT __declspec(dllexport)
#define PBCALL __stdcall
class CTest {
public: 
	DLLEXPORT static CTest* PBCALL makeInstance() {
		return new CTest();
	}
	//1 вариант
	DLLEXPORT int PBCALL method1(int arg) {
		return arg;
	}
	// 2 вариант
	DLLEXPORT static int PBCALL method2_p(CTest* instance, int arg) {
		return instance->method2(arg);
	}
	int method2(int arg) {
		return arg;
	}

};

;mylib.def
LIBRARY 
EXPORTS
	makeInstance
	method1
	method2_p


/* external decls
Function ulong makeInstance() alias for "makeInstance" library "mylib.dll"
Function ulong method1(ulong instance, long arg) alias for "method1" library "mylib.dll"
Function ulong method2(ulong instance, long arg) alias for "method2_p" library "mylib.dll"
*/



Второй вариант позволяет применять виртуальные методы.
Попытался повторить, не получилось.
А как это все работает на стороне РВ?
Например, что на выходе функции "makeInstance" и как это принять в РВ? Почему у функции "method1" два аргумента?
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #39581267
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISПопытался повторить, не получилось.
А как это все работает на стороне РВ?
Например, что на выходе функции "makeInstance" и как это принять в РВ? Почему у функции "method1" два аргумента?
Код: sql
1.
2.
3.
4.
ulong obj
obj = makeInstance()
method1(obj, 123);
method2(obj, 123);


У method1 в ПБ два аргумента потому что в С++ у методов (кроме статических) есть один дополнительный неявный аркумент - адрес экземпляра класса (это то что возвращает makeInstance)
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #39581654
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky ,
спасибо, что пояснили.
Хотя все равно не до конца понял, почему в РВ декларируется функция с двумя параметрами,
Код: sql
1.
Function ulong method1(ulong instance, long arg) alias for "method1" library "mylib.dll"


когда в С у неё только один.
Код: plaintext
1.
2.
3.
4.
//1 вариант
DLLEXPORT int PBCALL method1(int arg) {
	return arg;
}


По method2 вопросов нет, но то таке, все равно это надо будет взять на вооружение.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #39582011
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

авторпотому что в С++ у методов (кроме статических) есть один дополнительный неявный аргумент
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #39582438
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
понял, спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / С++ Class Builder, Увеличение производительности строковых функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]