Указатели и обобщения
От: _NN_ www.nemerleweb.com
Дата: 22.10.17 19:07
Оценка:
Перевожу код из C++/CLI, который использует шаблоны и указатели в C#.
Однако C# пока ещё не позволяет использовать указатели с обобщениями.

struct A<T> {}

A<int>* p; // :(


Один из вариантов это через Marshal.PtrToStructure, что приведёт к лишним копиям, и 'struct' вдобавок придётся заменить на 'class'.
Другое решение через генерацию в виде .tt файла.

Есть другие интересные способы решить эту задачу?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Указатели и обобщения
От: Nikolay_Ch Россия  
Дата: 22.10.17 19:15
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Перевожу код из C++/CLI, который использует шаблоны и указатели в C#.

_NN>Однако C# пока ещё не позволяет использовать указатели с обобщениями.
Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости?
Отредактировано 22.10.2017 19:16 Nikolay_Ch . Предыдущая версия .
Re[2]: Указатели и обобщения
От: _NN_ www.nemerleweb.com
Дата: 22.10.17 19:19
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости?

Да.
В этом месте любое копирование будет во вред.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Указатели и обобщения
От: Sinix  
Дата: 22.10.17 19:55
Оценка:
Здравствуйте, _NN_, Вы писали:

N_C>>Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости?

_NN>Да.
_NN>В этом месте любое копирование будет во вред.

ref return-ы из c# 7 не подойдут?
Re[4]: Указатели и обобщения
От: _NN_ www.nemerleweb.com
Дата: 22.10.17 20:01
Оценка:
Здравствуйте, Sinix, Вы писали:

S>ref return-ы из c# 7 не подойдут?


Не очень.
У меня вызов функции из нативного кода, где я получаю простой указатель.
Далее я его обрабатываю по разному в зависимости от платформы и заголовка.

Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#.

Кстати, как лучше всего перекидывать в C# тип вроде hash_map<wstring, struct Data { uint64_t x; uint64_t y;}> (в оригинале Dictionary<String, Data>) ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Указатели и обобщения
От: Sinix  
Дата: 22.10.17 20:54
Оценка: +2
Здравствуйте, _NN_, Вы писали:

__NN>Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#.

Если нужен интероп _и_ производительность, то я бы не мучался и делал бы всё в нативе. Накладные расходы невесёлые будут, особенно с non-blittable.
Старые guidelines примерно то же советуют.


_NN>Кстати, как лучше всего перекидывать в C# тип вроде hash_map<wstring, struct Data { uint64_t x; uint64_t y;}> (в оригинале Dictionary<String, Data>) ?

Никак емнип. Или c-style (структуры и массивы), или com-интероп. Ну, т.е. можно прокинуть указатель на словарь и сделать нативные методы для вытаскивания значений из словаря, но как-то это печально совсем.
Но я тот ещё спец в интеропе, могу ошибаться.
Re[6]: Указатели и обобщения
От: _NN_ www.nemerleweb.com
Дата: 25.10.17 19:30
Оценка:
Здравствуйте, Sinix, Вы писали:

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


__NN>>Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#.

S>Если нужен интероп _и_ производительность, то я бы не мучался и делал бы всё в нативе. Накладные расходы невесёлые будут, особенно с non-blittable.
S>Старые guidelines примерно то же советуют.

Полностью нативно никак да и не хочется
Вот если бы были шаблоны в C# не было бы проблем выбора.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.