- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
internal unsafe static void Memcpy(byte* dest, byte* src, int len) {
Contract.Assert(len >= 0, "Negative length in memcopy!");
//
// This is portable version of memcpy. It mirrors what the hand optimized assembly versions of memcpy typically do.
//
// Ideally, we would just use the cpblk IL instruction here. Unfortunately, cpblk IL instruction is not as efficient as
// possible yet and so we have this implementation here for now.
//
switch (len)
{
case 0:
return;
case 1:
*dest = *src;
return;
case 2:
*(short *)dest = *(short *)src;
return;
case 3:
*(short *)dest = *(short *)src;
*(dest + 2) = *(src + 2);
return;
case 4:
*(int *)dest = *(int *)src;
return;
case 5:
*(int*)dest = *(int*)src;
*(dest + 4) = *(src + 4);
return;
case 6:
*(int*)dest = *(int*)src;
*(short*)(dest + 4) = *(short*)(src + 4);
return;
case 7:
*(int*)dest = *(int*)src;
*(short*)(dest + 4) = *(short*)(src + 4);
*(dest + 6) = *(src + 6);
return;
case 8:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
return;
case 9:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
*(dest + 8) = *(src + 8);
return;
case 10:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
*(short*)(dest + 8) = *(short*)(src + 8);
return;
case 11:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
*(short*)(dest + 8) = *(short*)(src + 8);
*(dest + 10) = *(src + 10);
return;
case 12:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
*(int*)(dest + 8) = *(int*)(src + 8);
return;
case 13:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
*(int*)(dest + 4) = *(int*)(src + 4);
#endif
*(int*)(dest + 8) = *(int*)(src + 8);
*(dest + 12) = *(src + 12);
return;
case 14:
#if WIN64
*(long*)dest = *(long*)src;
#else
*(int*)dest = *(int*)src;
j123123 13.03.2017 07:25 # −10
Dummy00001 13.03.2017 19:53 # −8
bagor 13.03.2017 19:58 # −8
C# разрешает сказать unsafe и делать что угодно
Иначе как бы работал PInvoke (вызов нативных фукнций)?
Dummy00001 13.03.2017 20:03 # −8
это у них что не "деталь реализации"? и никакого моста (c-python, jni, ffi) ни промежуточного языка (perl xs) нету?
ЗЫ многие языки не мучаются и берут libFFI (foreign function interface) - она динамически умеет вызывать функции с произвольной конвенцией.
cykablyad 13.03.2017 20:14 # −8
и вызывать функции из дллки (в Mono работает, в .NET Core выпилили вроде)
А еще можно взять откуда-нибудь указатель на функцию, сделать Marshal.PtrToDelegate и тоже вызвать
Соглашение вызова, кодировку и какие аргументы в какие типы конвертить - все это можно настроить
bagor 13.03.2017 20:17 # −8
Есть вроде какой-то Ptr, но я не уверен что его всегда хватает
cykablyad 13.03.2017 20:19 # −8
Для дотнетных структур надо указать [StructLayout], чтобы передавать их куда-нибудь (Sequential для упакованных структур, Explicit если надо особо выровнять)
bagor 13.03.2017 20:34 # −8
Похоже MS много сделал чтобы уметь PInvoke out of the box.
Зы: умел бы еще структы с верным StructLayout генерить по .h файлам вообще ценыб не было
или умеет?
cykablyad 13.03.2017 21:07 # −8
P.S. тем более что в юнионы (только если с костылями) и битфилды не умеет
bagor 13.03.2017 21:09 # −8
ну вот почему?
почему для SOAP по WSDL они умеют стабы, почему по IDL обычно для RPC и COM и что там еще они тоже умеют стабы (вроде бы), а по .h нет?
cykablyad 13.03.2017 21:11 # −8
bagor 13.03.2017 21:41 # −15
я просто хотел сказать что это пахнет идиотизмом -- сидеть и переписывать вручную структуры из msdn
cykablyad 13.03.2017 21:42 # −15
bagor 13.03.2017 21:45 # −16
cykablyad 13.03.2017 21:46 # −15
bagor 13.03.2017 21:47 # −15
bagor 13.03.2017 21:48 # −15
bagor 13.03.2017 21:48 # −15
cykablyad 13.03.2017 09:14 # −9
roman-kashitsyn 13.03.2017 11:30 # −8
ASD_77 13.03.2017 12:48 # −10
roman-kashitsyn 13.03.2017 12:52 # −6
Дожили, люди уже ЯВНЫЙ ЗЕЛЁНЫЙ не понимают.
CTEPTOP 13.03.2017 15:11 # −10
Если по инерции пойти дальше, вывод будет ещё страшнее: кнопка выставления рейтинга тоже зеленая!.. Неужели, во всём этом скрыт сарказм?.. Не верится, что страйко так ужасно насмеялся над всеми нами... Я считаю, всё же, что зеленый цвет - что-то вроде подсказки для тупиц, о том, что мнение голосующих не всегда объективно.
paul 13.03.2017 15:15 # −10
Возьмём, к примеру, борманда. Его плюсовали и за дело, и тогда, когда он постил гоатсе.
roman-kashitsyn 13.03.2017 15:20 # −9
Разумеется. По умолчанию на этом сайте всё следует толковать как сарказм, пока не заявлено обратное. Зелёный цвет лишь является напоминанием.
Dummy00001 13.03.2017 16:04 # −10
ASD_77 13.03.2017 12:55 # −10
Как Вам?
Dummy00001 13.03.2017 16:01 # −9
в добавок еще и ихнюю хуиту с *printf* функциями исправит.
gost 13.03.2017 17:03 # −10
bagor 13.03.2017 17:51 # −14
4_14sun 13.03.2017 17:58 # −16
pdro245 13.03.2017 18:26 # −8
pdro246 13.03.2017 18:26 # −8
pdro247 13.03.2017 18:26 # −8
pdro248 13.03.2017 18:26 # −8
pdro249 13.03.2017 18:26 # −8
pdro250 13.03.2017 18:26 # −8
pdro251 13.03.2017 18:26 # −8
pdro252 13.03.2017 18:26 # −8
pdro253 13.03.2017 18:26 # −8
pdro254 13.03.2017 18:26 # −7
pdro255 13.03.2017 18:26 # −8
pdro256 13.03.2017 18:26 # −8
pdro257 13.03.2017 18:26 # −8
pdro258 13.03.2017 18:26 # −8
pdro259 13.03.2017 18:26 # −8
pdro260 13.03.2017 18:26 # −8
pdro261 13.03.2017 18:26 # −8
pdro262 13.03.2017 18:26 # −8
pdro263 13.03.2017 18:26 # −8
pdro264 13.03.2017 18:26 # −8
bagor 13.03.2017 21:46 # −15
bagor 13.03.2017 21:50 # −15
pdro1 13.03.2017 21:50 # −16
bagor 13.03.2017 21:51 # −15
pdro4 13.03.2017 21:50 # −16
bagor 13.03.2017 21:51 # −15
Извините, но я больше не намерен тут оставаться с таким отношением!!
pdro2 13.03.2017 21:50 # −16
bagor 13.03.2017 21:51 # −15