Всем привет. В этот раз продолжаем смеяться над нормальным вызовом методов. Предлагаю ознакомится с вызовом метода с параметрами без передачи параметров. Также попробуем преобразовать ссылочный тип в число — его адрес, без использования указателей и unsafe кода.
Рубрика «memory» - 2
Пропихиваем параметры в небезопасные операции в безопасном коде
2018-09-21 в 12:29, admin, рубрики: .net, C#, inside, memory, method table, structlayout, ненормальное программирование, ооп, Проектирование и рефакторингНе уважаю инкапсуляцию, или использование таблицы методов другого типа для быстрого вызова приватных методов
2018-09-18 в 12:09, admin, рубрики: .net, C#, inside, memory, method table, structlayout, высокая производительность, ненормальное программирование, оопВсем привет. Хотелось бы поделиться примером использования StructLayout для чего-то более интересного, чем примеры с байтами, интами и прочими цифрами, в которых все происходит чуть более, чем ожидаемо.
Читать полностью »
[DotNetBook]: Span, Memory и ReadOnlyMemory
2018-08-13 в 12:40, admin, рубрики: .net, C#, clrbook, DotNetBook, memory, spanЭтой статьей я продолжаю публиковать целую серию статей, результатом которой будет книга по работе .NET CLR, и .NET в целом. За ссылками — добро пожаловать по кат.
Memory<T> и ReadOnlyMemory<T>
Визуальных отличий Memory<T>
от Span<T>
два. Первое — тип Memory<T>
не содержит ограничения ref
в заголовке типа. Т.е., другими словами, тип Memory<T>
имеет право находиться не только на стеке, являясь либо локальной переменной либо параметром метода либо его возвращаемым значением, но и находиться в куче, ссылаясь оттуда на некоторые данные в памяти. Однако эта маленькая разница создает огромную разницу в поведении и возможностях Memory<T>
в сравнении с Span<T>
. В отличии от Span<T>
, который представляет собой средство пользования неким буфером данных для некоторых методов, тип Memory<T>
предназначен для хранения информации о буфере, а не для работы с ним.
Эта статья — вторая из цикла про Span<T> и Memory<T>. Она является вводной для Memory<T> в том плане что здесь я решил расписать общую терминилогию, а вот примеры совместного использования — решил вывести в отдельную статью
- Span<T>: новый тип данных .NET
- Span<T> и ReadOnlyMemory<T>
- Практика использования Span<T> и Memory<T>
[DotNetBook] Span: новый тип данных .NET
2018-08-01 в 13:15, admin, рубрики: .net, C#, clrbook, memory, memory management, span, unsafe
С этой статьей я продолжаю публиковать целую серию статей, результатом которой будет книга по работе .NET CLR, и .NET в целом (уже готово около 200 страниц книги, так что добро пожаловать в конец статьи за ссылками).
Как язык, так и платформа существуют уже много лет: и все это время существовало множество средств для работы с неуправляемым кодом. Так почему же сейчас выходит очередной API для работы с неуправляемым кодом если по сути он существовал уже много-много лет? Для того чтобы ответить на этот вопрос достаточно понять чего не хватало нам раньше.
Разработчики платформы и раньше пытались нам помочь скрасить будни разработки с использованием неуправляемых ресурсов: это и автоматические врапперы для импортируемых методов. И маршаллинг, который в большинстве случаев работатет автоматически. Это также инструкция stackallloc
, о которой говорится в главе про стек потока. Однако, как по мне если ранние разработчики с использованием языка C# приходили из мира C++ (как сделал это и я), то сейчас они приходят из более высокоуровневых языков (я, например, знаю разработчика, который пришел из JavaScript). А что это означает? Это означает что люди со все большим подозрением начинают относиться к неуправляемым ресурсам и конструкциям, близким по духу к C/C++ и уж тем более — к языку Ассемблера.
Статья хоть и большая, но является вводной в тему
Span<T>
иMemory<T>
. Планируется что выйдет еще две: первая проMemory<T>, MemoryManager<T>, MemoryHandler<T>
иMemoryPool<T>
. Вторая — про низкоуровневые особенности и вопросы кSpan<T>
иMemory<T>
.
Сколько объектов выделяет Python, выполняя скрипты?
2018-07-26 в 12:35, admin, рубрики: gc, memory, python, ПрограммированиеНекоторые Python программисты сильно удивляются, когда узнают сколько временных объектов интерпретатор питона выделяет во время работы простого скрипта.
CPython позволяет получить статистику по выделяемым объектам, для этого его нужно скомпилировать с дополнительными флагами.
./configure CFLAGS='-DCOUNT_ALLOCS' --with-pydebug
make -s -j2
Java и без 16Gb памяти?
2017-07-16 в 12:11, admin, рубрики: ads-b, heap, java, memory, Raspberry Pi, Satellite, спутникиОднажды меня посетила мысль о том, что надо закодить что-нибудь на Java для RaspberryPI. Предыстория того, как я дошёл до жизни такой, сама по себе потянет на отдельный пост. Но вот сочные технические подробности, трудности и счастливый конец ниже под катом.
Linux все еще не торт
2017-07-11 в 4:17, admin, рубрики: autotest, bugs, continuous integration, crash, CRIU, leaks, linux, linux kernel, memory, open source, panic, system programming, upstream, Блог компании Virtuozzo, Разработка под Linux, системное программирование, Тестирование IT-системЭта история началась около месяца назад, когда Кирилл Тхай добавил поддержку вложенных пространств имен в CRIU, после чего наша система CI приказала долго жить. В тот момент ничто не предвещало тех увлекательных приключений, в которые мы оказались вовлечены.
Немного о строках в Си, или несколько вариантов оптимизировать неоптимизируемое
2017-04-12 в 11:57, admin, рубрики: allocation, C, c++, memory, memory leaks, memory management, system programming, отладка, Программирование, Совершенный кодХабра, привет!
Не так давно у со мной произошел довольно-таки интересный инцидент, в котором был замешан один из преподавателей одного колледжа информатики.
Разговор о программировании под Linux медленно перешел к тому, что этот человек стал утверждать, что сложность системного программирования на самом деле сильно преувеличена. Что язык Си прост как спичка, собственно как и ядро Linux (с его слов).
У меня был с собой ноутбук с Linux, на котором присутствовал джентльменский набор утилит для разработки на языке Си (gcc, vim, make, valgrind, gdb). Я уже не помню, какую цель мы тогда перед собой поставили, но через пару минут мой оппонент оказался за этим ноутбуком, полностью готовый решать задачу.
И буквально на первых же строках он допустил серьезную ошибку при аллоцировании памяти под… строку.
char *str = (char *)malloc(sizeof(char) * strlen(buffer));
buffer — стековая переменная, в которую заносились данные с клавиатуры.
Я думаю, определенно найдутся люди, которые спросят: «Разве что-то тут может быть не так?».
Поверьте, может.
А что именно — читайте по катом.
Читать полностью »
Работа с устройствами печати в C# на примере реализации виртуального принтера
2017-02-23 в 0:08, admin, рубрики: .net, alloc, allocate, allocation, api, C#, code, develop, developing, driver, error, escorp, exomode, extern, intptr, invoke, malloc, marshal, marshalling, memory, native, PInvoke, pointer, port, print, printing, programming, technologies, technology, virtual, WinAPI, больше, виртуальный, выделение, Драйвер, код, маршалинг, маршалирование, монитор, натив, нужно, ооп, ошибка, память, печать, принтер, Программирование, разработка под windows, тегов., указательПриветствую всех. В сегодняшней статье речь пойдёт о том, как можно реализовать собственный высокоуровневый API в управляемом коде для работы с устройствами печати, от установки нового монитора печати в системе и до получения обработанного драйвером устройства печати документа с порта принтера.
Как и в прошлый раз, статья будет полезна для ознакомления разработчикам младшего и среднего звена. В процессе изучения материала, Вы узнаете как можно обращаться к низкоуровневым DLL WinAPI в C# с помощью P/Invoke, как установить, настроить и удалить из системы мониторы печати, драйвера принтера, само устройство печати, открыть и связать порт для перенаправления входных данных с устройства печати на монитор, познакомитесь с ключевыми моментами применения маршалирования. Так же мы на практическом примере разберёмся, как с помощью нашего API можно удобно манипулировать устройствами печати в системе, узнаем как можно перехватить обработанные данные после печати с принтера и, например, отправить их на сервер.
Читать полностью »
Как я уговорил BILL и ISPmanager Lite 5 менять оперативную память на тарифе виртуального хостинга
2016-11-28 в 8:36, admin, рубрики: Apache, apache2, billmanager, cgi, ipsmanager, isp, limit, memory, memory management, Серверное администрирование, хостингДо недавних пор я создавал сайты и плагины на WordPress, арендуя виртуальные хостинги у провайдеров. Для себя еще давно выделил панель ISP за удобность и практичность. Так случилось, что все время работал на Windows, следовательно, Linux для меня — темный лес с диким животными. Сайты со временем «росли» и становились более требовательны, как минимум к дисковому пространству и иногда к оперативной памяти.
Пару месяцев назад по некоторым соображениям решил арендовать виртуальный сервер на Linux и самостоятельно установить туда ISP и BILL для создания и управления услугами.
Поколдовав несколько часов с документацией и SSH консолью, я запустил свой первый сервер на CentOS. В течение недели выяснил: почему gmail.ru и mail.ru не хотят принимать письма с моего хостинга, как устанавливать ограничения на дисковое пространство, контролировать настройки php для каждого виртуального хостинга и что BILL, имея в своем арсенале возможность покупки дополнительных параметров, включая пункт «Оперативная память», не может на самом деле устанавливать ее.