SlideShare a Scribd company logo
Сергей Балтийский
JetBrains
Why?
∞Скорость
∞ Оптимизация CPU
∞ Затраты на переключение контекста
∞Память
∞ Управление памятью
∞ GC
∞Legacy
∞ Библиотеки на C/C++
How?
∞C++/CLI
∞COM
∞PInvoke
∞Native Memory in C#
Unsafe Code
∞Verifiable-код — ценность C#
∞В C# можно писать C-style код
∞Хочется разделять эти вещи
∞ unsafe keyword
∞ UnverifiableCodeAttribute custom attribute
Unsafe or not?
POINT pt = new POINT();
User32Dll.GetCursorPos(&pt);
IntPtr ptr = Marshal.AllocHGlobal(sizeof(RECT));
Marshal.StructureToPtr(new RECT(0,0,100,100), ptr, false);
var handle = SetWindowsHookExW(HookType.WH_CALLWNDPROCRET,
new HOOKPROC(HookProc), IntPtr.Zero, Kernel32Dll.GetCurrentThreadId());
[DllImport("user32.dll")]
static extern bool GetScrollBarInfo(IntPtr hWnd, long idObject, IntPtr psbi);
Unmanaged Pointers
∞IntPtr
∞ (native int)
∞UIntPtr
∞ (native unsigned int)
∞void*
∞byte*
IntPtr vs. T*
∞Арифметика
∞ T* — операции сложения по правилам указателей
∞ IntPtr — присутствуют в отдельных новых версиях
∞Разница в Sign Extension
∞ T* никак специально не трогает старшие биты
∞ IntPtr при кастах расширяет старшим битом
∞unsafe keyword
IntPtr vs. T*
∞Арифметика указателей: типичный антипаттерн
IntPtr ptr = data.Scan0;
for (int a = count; a --> 0;)
{
ProcessByte(Marshal.ReadByte(ptr));
ptr = (IntPtr)((Int32)ptr + Marshal.SizeOf(typeof(Byte)));
}
var pb = (byte*)data.Scan0;
for(int a = count; a --> 0;)
{
ProcessByte(*pb);
pb++;
}
IntPtr vs. T*
∞Нежелательный sign extension
uint theirs = 0xdeadbeef;
var received1 = (IntPtr)(void*)theirs;
var received2 = (void*)theirs;
ulong ours1 = (ulong)(long)received1;
ulong ours2 = (ulong)received2;
theirs (IntPtr) ours1 (void*) ours2
32-bit DEADBEEF FFFFFFFFDEADBEEF DEADBEEF
64-bit DEADBEEF DEADBEEF DEADBEEF
Pinning
∞Задача: получить указатель на value type
∞Value type на стеке:
∞ Не может перемещаться в памяти
∞ Можно непосредственно взять указатель
RECT rc = new RECT();
RECT *pRect = &rc;
Pinning
∞Задача: получить указатель на value type
∞Value type внутри reference type object
∞ Адрес в памяти может меняться при GC
∞ Interior pointer
∞ Pinning, чтобы на время запретить перемещать
объект
WindowWrapper ww = new WindowWrapper();
fixed(RECT *pRect = &ww.Bounds)
Use(pRect);
class WindowWrapper
{ public RECT Bounds; }
Pinning by C# Compiler
∞fixed()
∞Реализвано как атрибут локальной переменной
∞ Нет императивной команды pin/unpin
∞ Нет ограничения на тип объекта
∞ Но компилятор C# ограничивает до “unmanaged types”
∞ Только пока исполняется функция
∞ Кроме closures & coroutines
Pinning by C# Compiler
∞Специальная магия для массивов
∞Специальная магия для строк
fixed(byte* pBuf1 = buffer) { }
fixed(byte* pBuf2 = &buffer[0]) { }
fixed(char* pch = text) { }
System.Runtime.CompilerServices.RuntimeHelpers::OffsetToStringData
Pinning with GC Handle
∞Создаём GC Handle специального типа
∞Время жизни не ограничено
∞ Для этого и берут
∞ Из-за длительных пинов GC Heap может держать
много «пустой» памяти
∞Только blittable types
GCHandle::Alloc()
GCHandleType::Pinned
GCHandle::AddrOfPinnedObject()
Классификация объектов
POD POJO
Blittable Unmanaged
Managed
Value Type
Reference Type
Blittable Objects
C# declaration
layout
Marshalled
memory layout
.NET Runtime
memory layout
Blittable Objects
∞Гарантированный memory layout
∞ Идентичный результат через Marshal и через T*
∞ Почти аналогичен C++ POD
∞ Trivial Classes
∞ Standard Layout Classes
∞ Не забыть про StructLayoutAttribute::Pack
Blittable Objects
∞Нет compile-time индикации, что объект blittable
∞ fixed() всё равно компилируется
∞ MethodTable::IsBlittable в CLR
∞ Косвенные измерения, например,
попытка создать Pinned GC Handle
Suddenly, non-blittable
∞T* memory layout отличается от ожидаемого
∞Interop с C/C++/WinAPI ломается
∞Бинарный формат меняется
∞ Может быть несущественно в пределах одного CLR
∞ Бинарная несовместимость между разными CLR
∞ Например, CLR4 и Mono
Blittable Types
∞Signed/unsigned integers
∞Signed/unsigned native integers
∞Single, Double
∞Value types:
∞ С LayoutKind Sequential или Explicit,
∞ И с blittable types внутри
∞Одномерные массивы из blittable types
Why non-blittable?
∞LayoutKind Auto
∞ CLR может переставлять данные в памяти для
оптимальной упаковки
Why non-blittable?
∞Boolean type
∞ Размер зависит от контекста маршаллинга
∞ WinAPI BOOL  32-bit integer
∞ А в массиве может занимать 1 байт
∞ False  0, а True в общем случае всё остальное
∞ WinAPI предпочитает 1, Visual Basic — -1
public static void CheckBools(bool x, bool y)
{
if(!x) return;
if(!y) return;
if(x!=y) throw new InvalidOperationException("x!=y");
}
Why non-blittable?
∞Char type
∞Поддержка ANSI encodings в CLR
∞ Windows 98 (!)
∞ ANSI-варианты WinAPI на Windows NT
∞ Маршаллер умеет конвертировать UTF-16LE <-> ANSI
∞ Это меняет размер и layout структуры
Char Mitigation
∞Использовать Int16 вместо Char
∞Везде выставлять
∞Структуры вместо fixed arrays
∞ Собственно, компилятор так и делает
StructLayoutAttribute::CharSet  CharSet.Unicode
public fixed Char cFileName[260];
public CFileName cFileName;
[StructLayout(LayoutKind.Explicit, Size = 260*2)]
public struct CFileName { }
Marshalling Strings
LPCTSTR
A
WØ
LPCWSTRLPWSTR
String Representation
LPCWSTR
WCHAR*
_wchar_t*
System.Char*
System.String
UTF16-LE
ASCIIZ
Strings: CLR  Native
LPCWSTR
string
fixed()
char*char[]
Int16[] Int16*
Внимание на NULL-terminated
Strings: Native  CLR
∞Строка в статичной native памяти
∞ Просто new string()
∞ Внимание на длину и terminating null
∞Native выделил память специально для нас
∞ new string() и освободить память за собой
∞ Правильной функцией
∞Мы сами выделяем буфер
Strings: Native  CLR
∞Мы сами выделяем буфер
∞ Возможно, придётся договариваться о размере
∞ Вариант StringBuilder
∞ Вариант stackalloc
∞ Вариант pooled byte[]
∞ Вариант выделения native памяти
Strings: Native  CLR
∞Нужен ли нам string object?
∞ new string() это нагрузка на GC
∞ Interning, кеширование?
∞ Достаточно hash code, equals, compare?
∞ Можно реализовать прямо на char*
∞ Частные хитрости
∞ Потребовать уникальность хеша
∞ Использовать metadata token вместо type full name
THE END

More Related Content

What's hot

Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
Yandex
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
Platonov Sergey
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
corehard_by
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Platonov Sergey
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
Alexey Paznikov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Alexey Paznikov
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
aragozin
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
Platonov Sergey
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
Platonov Sergey
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Yandex
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
Alexey Paznikov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
Tatyanazaxarova
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
Andrey Karpov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
Sergey Platonov
 

What's hot (20)

Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 

Similar to Когда в C# не хватает C++ . Часть 2.

Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Ontico
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Yandex
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
OOO "Program Verification Systems"
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
Anton Patrushev
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
Smolensk Computer Science Club
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
Sergey Platonov
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
Alexander Shigin
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
Andrey Karpov
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
GetDev.NET
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
Tatyanazaxarova
 

Similar to Когда в C# не хватает C++ . Часть 2. (20)

Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 

More from Mikhail Shcherbakov

Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
Mikhail Shcherbakov
 
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
Mikhail Shcherbakov
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
Mikhail Shcherbakov
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
Mikhail Shcherbakov
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
Mikhail Shcherbakov
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
Mikhail Shcherbakov
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
Mikhail Shcherbakov
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
Mikhail Shcherbakov
 
Project Rider
Project RiderProject Rider
Project Rider
Mikhail Shcherbakov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
 
Structured logging
Structured loggingStructured logging
Structured logging
Mikhail Shcherbakov
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
Mikhail Shcherbakov
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
Mikhail Shcherbakov
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Mikhail Shcherbakov
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
Mikhail Shcherbakov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
Mikhail Shcherbakov
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
Mikhail Shcherbakov
 
Разработка мобильных приложений на С# с использованием Xamarin
Разработка мобильных  приложений на С# с использованием XamarinРазработка мобильных  приложений на С# с использованием Xamarin
Разработка мобильных приложений на С# с использованием Xamarin
Mikhail Shcherbakov
 

More from Mikhail Shcherbakov (20)

Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
 
Project Rider
Project RiderProject Rider
Project Rider
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Structured logging
Structured loggingStructured logging
Structured logging
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
Visual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging ToolsVisual Studio 2015 Diagnostic and Debugging Tools
Visual Studio 2015 Diagnostic and Debugging Tools
 
Разработка мобильных приложений на С# с использованием Xamarin
Разработка мобильных  приложений на С# с использованием XamarinРазработка мобильных  приложений на С# с использованием Xamarin
Разработка мобильных приложений на С# с использованием Xamarin
 

Когда в C# не хватает C++ . Часть 2.

  • 2. Why? ∞Скорость ∞ Оптимизация CPU ∞ Затраты на переключение контекста ∞Память ∞ Управление памятью ∞ GC ∞Legacy ∞ Библиотеки на C/C++
  • 4. Unsafe Code ∞Verifiable-код — ценность C# ∞В C# можно писать C-style код ∞Хочется разделять эти вещи ∞ unsafe keyword ∞ UnverifiableCodeAttribute custom attribute
  • 5. Unsafe or not? POINT pt = new POINT(); User32Dll.GetCursorPos(&pt); IntPtr ptr = Marshal.AllocHGlobal(sizeof(RECT)); Marshal.StructureToPtr(new RECT(0,0,100,100), ptr, false); var handle = SetWindowsHookExW(HookType.WH_CALLWNDPROCRET, new HOOKPROC(HookProc), IntPtr.Zero, Kernel32Dll.GetCurrentThreadId()); [DllImport("user32.dll")] static extern bool GetScrollBarInfo(IntPtr hWnd, long idObject, IntPtr psbi);
  • 6. Unmanaged Pointers ∞IntPtr ∞ (native int) ∞UIntPtr ∞ (native unsigned int) ∞void* ∞byte*
  • 7. IntPtr vs. T* ∞Арифметика ∞ T* — операции сложения по правилам указателей ∞ IntPtr — присутствуют в отдельных новых версиях ∞Разница в Sign Extension ∞ T* никак специально не трогает старшие биты ∞ IntPtr при кастах расширяет старшим битом ∞unsafe keyword
  • 8. IntPtr vs. T* ∞Арифметика указателей: типичный антипаттерн IntPtr ptr = data.Scan0; for (int a = count; a --> 0;) { ProcessByte(Marshal.ReadByte(ptr)); ptr = (IntPtr)((Int32)ptr + Marshal.SizeOf(typeof(Byte))); } var pb = (byte*)data.Scan0; for(int a = count; a --> 0;) { ProcessByte(*pb); pb++; }
  • 9. IntPtr vs. T* ∞Нежелательный sign extension uint theirs = 0xdeadbeef; var received1 = (IntPtr)(void*)theirs; var received2 = (void*)theirs; ulong ours1 = (ulong)(long)received1; ulong ours2 = (ulong)received2; theirs (IntPtr) ours1 (void*) ours2 32-bit DEADBEEF FFFFFFFFDEADBEEF DEADBEEF 64-bit DEADBEEF DEADBEEF DEADBEEF
  • 10. Pinning ∞Задача: получить указатель на value type ∞Value type на стеке: ∞ Не может перемещаться в памяти ∞ Можно непосредственно взять указатель RECT rc = new RECT(); RECT *pRect = &rc;
  • 11. Pinning ∞Задача: получить указатель на value type ∞Value type внутри reference type object ∞ Адрес в памяти может меняться при GC ∞ Interior pointer ∞ Pinning, чтобы на время запретить перемещать объект WindowWrapper ww = new WindowWrapper(); fixed(RECT *pRect = &ww.Bounds) Use(pRect); class WindowWrapper { public RECT Bounds; }
  • 12. Pinning by C# Compiler ∞fixed() ∞Реализвано как атрибут локальной переменной ∞ Нет императивной команды pin/unpin ∞ Нет ограничения на тип объекта ∞ Но компилятор C# ограничивает до “unmanaged types” ∞ Только пока исполняется функция ∞ Кроме closures & coroutines
  • 13. Pinning by C# Compiler ∞Специальная магия для массивов ∞Специальная магия для строк fixed(byte* pBuf1 = buffer) { } fixed(byte* pBuf2 = &buffer[0]) { } fixed(char* pch = text) { } System.Runtime.CompilerServices.RuntimeHelpers::OffsetToStringData
  • 14. Pinning with GC Handle ∞Создаём GC Handle специального типа ∞Время жизни не ограничено ∞ Для этого и берут ∞ Из-за длительных пинов GC Heap может держать много «пустой» памяти ∞Только blittable types GCHandle::Alloc() GCHandleType::Pinned GCHandle::AddrOfPinnedObject()
  • 15. Классификация объектов POD POJO Blittable Unmanaged Managed Value Type Reference Type
  • 17. Blittable Objects ∞Гарантированный memory layout ∞ Идентичный результат через Marshal и через T* ∞ Почти аналогичен C++ POD ∞ Trivial Classes ∞ Standard Layout Classes ∞ Не забыть про StructLayoutAttribute::Pack
  • 18. Blittable Objects ∞Нет compile-time индикации, что объект blittable ∞ fixed() всё равно компилируется ∞ MethodTable::IsBlittable в CLR ∞ Косвенные измерения, например, попытка создать Pinned GC Handle
  • 19. Suddenly, non-blittable ∞T* memory layout отличается от ожидаемого ∞Interop с C/C++/WinAPI ломается ∞Бинарный формат меняется ∞ Может быть несущественно в пределах одного CLR ∞ Бинарная несовместимость между разными CLR ∞ Например, CLR4 и Mono
  • 20. Blittable Types ∞Signed/unsigned integers ∞Signed/unsigned native integers ∞Single, Double ∞Value types: ∞ С LayoutKind Sequential или Explicit, ∞ И с blittable types внутри ∞Одномерные массивы из blittable types
  • 21. Why non-blittable? ∞LayoutKind Auto ∞ CLR может переставлять данные в памяти для оптимальной упаковки
  • 22. Why non-blittable? ∞Boolean type ∞ Размер зависит от контекста маршаллинга ∞ WinAPI BOOL  32-bit integer ∞ А в массиве может занимать 1 байт ∞ False  0, а True в общем случае всё остальное ∞ WinAPI предпочитает 1, Visual Basic — -1 public static void CheckBools(bool x, bool y) { if(!x) return; if(!y) return; if(x!=y) throw new InvalidOperationException("x!=y"); }
  • 23. Why non-blittable? ∞Char type ∞Поддержка ANSI encodings в CLR ∞ Windows 98 (!) ∞ ANSI-варианты WinAPI на Windows NT ∞ Маршаллер умеет конвертировать UTF-16LE <-> ANSI ∞ Это меняет размер и layout структуры
  • 24. Char Mitigation ∞Использовать Int16 вместо Char ∞Везде выставлять ∞Структуры вместо fixed arrays ∞ Собственно, компилятор так и делает StructLayoutAttribute::CharSet  CharSet.Unicode public fixed Char cFileName[260]; public CFileName cFileName; [StructLayout(LayoutKind.Explicit, Size = 260*2)] public struct CFileName { }
  • 27. Strings: CLR  Native LPCWSTR string fixed() char*char[] Int16[] Int16* Внимание на NULL-terminated
  • 28. Strings: Native  CLR ∞Строка в статичной native памяти ∞ Просто new string() ∞ Внимание на длину и terminating null ∞Native выделил память специально для нас ∞ new string() и освободить память за собой ∞ Правильной функцией ∞Мы сами выделяем буфер
  • 29. Strings: Native  CLR ∞Мы сами выделяем буфер ∞ Возможно, придётся договариваться о размере ∞ Вариант StringBuilder ∞ Вариант stackalloc ∞ Вариант pooled byte[] ∞ Вариант выделения native памяти
  • 30. Strings: Native  CLR ∞Нужен ли нам string object? ∞ new string() это нагрузка на GC ∞ Interning, кеширование? ∞ Достаточно hash code, equals, compare? ∞ Можно реализовать прямо на char* ∞ Частные хитрости ∞ Потребовать уникальность хеша ∞ Использовать metadata token вместо type full name

Editor's Notes

  1. Full trust, partial trust, pure/verifiable, able to run, etc. PEVerify maybe.
  2. Don’t rely on continuous addresses
  3. C++: Trivial Classes Standard Layout Classes
  4. Про кодировки, UCS-2, UTF-16LE етц