Страницы

Рассогласованность runtime`ов библиотеки и программы

Давеча столкнулся с неприятной особенностью при разработке библиотеки на языке Си.
Есть в ней функции, возвращающие указатели на динамически выделенные массивы стандартного типа с помощью malloc(), по большей части это обычные Си-строки. Я рассчитывал, что освобождать эти данные из кода основной программы нужно стандартной функцией free(). Это разумно для компонентной системы, библиотека и программа, ее использующая, динамически подключаются к одной и той же стандартной библиотеке, в результате чего используют согласованные средства для выделения и освобождения памяти.

Основная разработка ведется в Linux, и в ней нарушения этого принципа не наблюдалось. Для любых доступных комбинаций компиляторов (gcc, clang, tcc, tendracc) для библиотеки и приложения никаких накладок не было замечено. Собранная библиотека оказалась переносима между разными версиями дистрибутива.

А вот в Windows меня ждало небольшое разочарование. Библиотеку для нее собирали средствами mingw, а приложение - с помощью Visual Studio. Несмотря на заверения о том, что mingw использует родной для Windows c-runtime,  какую-то несовместимость он вносит. При попытке средствами программы освободить память, выделенную в библиотеке, происходит крах.

Есть категоричное мнение, что при правильной архитектуре освобождать нужно теми же средствами, что использовались для выделения. То есть в пару к функции, возвращающей указатель на динамически созданный объект, должна быть создана функция его освобождения.  Тогда проблемы рассогласованности не возникнет.

Разумно, тем не менее, я считаю такой подход не всегда адекватным.

Производительность ООП в C, Objective-C, C++

При создании программ на С в редких случаях, когда мне это нужно, я использую ООП, несмотря на нетипичность этого подхода для C.

Недавно я задался вопросом производительности подобного подхода. Понятно, что вручную я пишу больше кода, получаю меньше контроля со стороны компилятора по сравнению с языками, поддерживающими ООП. Но также мне интересна скорость работы.  Теоретически, компиляторы ООП - языков могут хитро оптимизировать и создавать даже более эффективный объектный код, чем ручные операции в C.