[C#]Ещё одна проблема с generics - как совместить generic и sizeof()
Marshal.SizeOf(typeof(T;
Но будет работать только, если T - value-type, очевидно.
upd. Но у тебя T - структура, так что все круто.
Но будет работать только, если T - value-type, очевидно.
upd. Но у тебя T - структура, так что все круто.
Сдаётся мне, что будет лагать 
Неужели не помогут генерики?

Неужели не помогут генерики?
1. В каком смысле лагать? Давать неверный результат? Требовать большого времени на вычисление? Или что?
2. В чем генерики должны помочь?
Кстати говоря, то, что ты делаешь, можно сделать без unsafe кода, если использовать Marshal.PtrToStructure
upd. Если у тебя sizeof(T) будет четным и invert == true, ты перевернешь всю память, до какой дотянешься.
2. В чем генерики должны помочь?
Кстати говоря, то, что ты делаешь, можно сделать без unsafe кода, если использовать Marshal.PtrToStructure
upd. Если у тебя sizeof(T) будет четным и invert == true, ты перевернешь всю память, до какой дотянешься.
а) медленнее
б) вижу, исправлю
б) вижу, исправлю
Тогда сделай так:
public class MarshalHlp<T> where T : structВ этом случае вычисление размера будет происходить один раз, в момент компиляции конкретного типа MarshalHlp, и потери скорости не будет.
{
static int size = Marshal.SizeOf(typeof(T;
public static T Read(Stream stream, bool invert)
{
...
}
}
Отличная идея! 
Однако остаётся проблема с инвертированием. Меня не радует идея использования маршалинга в более-менее критичном по скорости коде. Как передать byte* вместо byte[], если это возможно?

Однако остаётся проблема с инвертированием. Меня не радует идея использования маршалинга в более-менее критичном по скорости коде. Как передать byte* вместо byte[], если это возможно?
Однако остаётся проблема с инвертированием. Меня не радует идея использования маршалинга в более-менее критичном по скорости коде.
Не осознал, где проблема. Поясни, пожалуйста.
Мне показалось, что при использовании Marshal.PtrToStructure лишний раз передаются данные и вдобавок маршалер должен разбираться, как их преобразовывать. Это накладно.
Я сейчас посмотрел, использование Marshal.PtrToStructure в два раза замедляет код. Если скорость критична, лучше действительно остаться в unsafe коде
А вот если сделать что-нить такое:
void unsafe Invert(ref Chunk chunk)
{
fixed (Chunk * ptr = &chunk)
{
// cast to byte* and invert
}
}
Не станет ли существенно легче и быстрее?
void unsafe Invert(ref Chunk chunk)
{
fixed (Chunk * ptr = &chunk)
{
// cast to byte* and invert
}
}
Не станет ли существенно легче и быстрее?
афигеть нафига этот C# нужен?
чтоб потом хитрожопо преодолевать безопасный синтаксис чтоб добится скорости такой же как на тривиальном сишном коде?
чтоб потом хитрожопо преодолевать безопасный синтаксис чтоб добится скорости такой же как на тривиальном сишном коде?

чтобы один раз написать хитрожопо, а потом писать КРАСИВО
А вот если сделать что-нить такое:
...
Не станет ли существенно легче и быстрее?
Читай тему с начала. Нужен generic метод
чорд! вся загвоздка в "Cannot take the address of, get the size of, or declare a pointer to a managed type ('T') "
Йопт, и в чём проблема?
Сделай как Красин говорит - запомни размер в константу.
Насколько я понял, у тебя проблема ещё и в дополнительном копировании памяти - когда ты проинверсенную структуру возвращаешь из метода. Вот я тебе и советую - сделай функцию Invert, которой передаётся ссылка на структуру, а она её inplace инвертит. Правда, я не уверен, что это возможно - как шарп работает с ref struct я не особенно понимаю =)
Сделай как Красин говорит - запомни размер в константу.
Насколько я понял, у тебя проблема ещё и в дополнительном копировании памяти - когда ты проинверсенную структуру возвращаешь из метода. Вот я тебе и советую - сделай функцию Invert, которой передаётся ссылка на структуру, а она её inplace инвертит. Правда, я не уверен, что это возможно - как шарп работает с ref struct я не особенно понимаю =)
И буфер, в который считываешь фигню, тоже выдели статически.
И нефиг возвращать структуры, это медленно!
Всё это замеательно, конечно. Но вот проблема: нельзя взять поинтер от преременной генерик-типа T.
Поэтому я не вижу способов скопировать в неё данные напрямую из массива. Только маршалинг. А он слишком медленный, особенно для сложных структур
Поэтому я не вижу способов скопировать в неё данные напрямую из массива. Только маршалинг. А он слишком медленный, особенно для сложных структур
Используй макрогенератор и не парься.
+1
тем-более что в C# вроде можно разбить описание класса на несколько файлов, так что гемора с этим будет немного.
тем-более что в C# вроде можно разбить описание класса на несколько файлов, так что гемора с этим будет немного.
Скажи-ка, супервайзер!
Как поможет макрогенератор в случае, когда тип структуры я узнал в runtime-е?
Как поможет макрогенератор в случае, когда тип структуры я узнал в runtime-е?
А что, генерики умеют инстанцироваться в рантайме? А как их потом использовать?
Неверзелесс, можно и скомпилировать кусочек кода =)
Неверзелесс, можно и скомпилировать кусочек кода =)
Генерики инстанциируются именно в рантайме. Плюсы в том, что мы можем написать библиотеку, которая делает что-то, например, как у автора темы, читает из stream-а, а потом кто-то будет ее использовать, подсовывая свои типы и радуясь. Библиотека таким образом узнает о том, что в нее подсунули в runtime-е.
Скомпилировать кусочек кода - это отличная потеря времени, а главное, нереальный гемор. Ведь в случае твоего решения, у нас не будет никакой поддержки от студии при использовании этого кода.
Для автора треда наиболее правильным решением будет пользоваться Marshal.PtrToStructure. В конце концов, этот метод и предназначен для решения такой задачи.
Скомпилировать кусочек кода - это отличная потеря времени, а главное, нереальный гемор. Ведь в случае твоего решения, у нас не будет никакой поддержки от студии при использовании этого кода.
Для автора треда наиболее правильным решением будет пользоваться Marshal.PtrToStructure. В конце концов, этот метод и предназначен для решения такой задачи.
изврат.
пусть автор трэда расскажет подробнее для чего это ему нужно.
почти наверняка решение существует значительно более простое.
пусть автор трэда расскажет подробнее для чего это ему нужно.
почти наверняка решение существует значительно более простое.
Вот заволновался-то.
Тваё, канешна, прогер неадекватный
Тваё, канешна, прогер неадекватный

Злой ты 
Аргументы тогда приведи.

Аргументы тогда приведи.
Как правильно заметил Ваш оппонент, , требуется некий общий подход к решению проблемы. То есть надо уметь грузить произвольный структурный тип. В заголовке темы указано, что нужно совместить generics и работу с указателями.
Насколько я понял, единственным выходом является именно использование Marshal, т.к. в C# нельзя указать, что тип должен быть именно неуправляемым. Более того неуправляемыми являются только предопределённые типы данных. Надеюсь в будущем такое ограничение будет снято
Насколько я понял, единственным выходом является именно использование Marshal, т.к. в C# нельзя указать, что тип должен быть именно неуправляемым. Более того неуправляемыми являются только предопределённые типы данных. Надеюсь в будущем такое ограничение будет снято
эээ, ты сериализацию переписываешь?
Кстати говоря, то, что ты делаешь, можно сделать без unsafe кода, если использовать Marshal.PtrToStructureНе понял, как без unsafe. Где взять IntPtr?
public static object GetStructure(byte [] array, int startIndex, Type type)
{
int length = Marshal.SizeOf(type);
IntPtr pointer = Marshal.AllocHGlobal(length);
Marshal.Copy(array, startIndex, pointer, length);
object result = Marshal.PtrToStructure(pointer, type);
Marshal.FreeHGlobal(pointer);
return result;
}
Ыыыы...
При этом возвращается забоксенная структура и при любых попытках что-нибудь с ней сделать будет происходить unboxing и прочее копирование.
Я с самого начала говорю - если хочется превратить массив байт в структуру, то нужно передавать ссылку на то место, куда нужно засовывать результат (например, массив структур, а возможно и ref будет работать).
При этом возвращается забоксенная структура и при любых попытках что-нибудь с ней сделать будет происходить unboxing и прочее копирование.
Я с самого начала говорю - если хочется превратить массив байт в структуру, то нужно передавать ссылку на то место, куда нужно засовывать результат (например, массив структур, а возможно и ref будет работать).
Приведи полный код аналогичной функции у тебя, тогда можно будет сравнить по времени. А так - беспредметный спор.
Оставить комментарий
agaaaa
Error 6 Cannot take the address of, get the size of, or declare a pointer to a managed type ('T') D:\Coding\Projects\Lost\Lost\IO\StreamData.cs 33 49 Lost