Минимальный размер достигается из того что собирается без стандартной библиотеки. Если оставлять стандартную библиотеку, то самый релевантный ответ: --- -- Для уменьшения размера нужно переписывать чтобы не аттачилась стандартная библиотека: Код (C): static unsigned int rand_seed = 0; void my_srand(unsigned int seed) { rand_seed = seed; } int my_rand(void) { rand_seed = rand_seed * 1103515245 + 12345; return (unsigned int)(rand_seed / 65536) % 32768; } // Прототипы функций памяти void* my_alloc(SIZE_T size); void* my_realloc(void* ptr, SIZE_T new_size); void my_free(void* ptr); // Реализации функций работы с памятью void* my_alloc(SIZE_T size) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); } void* my_realloc(void* ptr, SIZE_T new_size) { if (ptr == NULL) { return my_alloc(new_size); } if (new_size == 0) { my_free(ptr); return NULL; } return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, new_size); } void my_free(void* ptr) { if (ptr) HeapFree(GetProcessHeap(), 0, ptr); } // Своя реализация strlen int my_strlen(const char* str) { const char* s = str; while (*s) s++; return (int)(s - str); } // Преобразование числа в строку void int_to_str(int num, char* buf) { int i = 0; int is_negative = 0; if (num < 0) { is_negative = 1; num = -num; } do { buf[i++] = '0' + (num % 10); num /= 10; } while (num > 0); if (is_negative) buf[i++] = '-'; buf[i] = '\0'; // Reverse for (int j = 0; j < i / 2; j++) { char temp = buf[j]; buf[j] = buf[i - 1 - j]; buf[i - 1 - j] = temp; } } Минимальный размер 9,50 КБ. На delphi примерно так же будет. Для delphi нужно убирать rtl код из SysInit и System и так же допиливать функции: Код (Pascal): function IntToStr(i: Integer): string; begin Str(i, Result); end; function FloatToStr(f: Real): string; var s: string; begin Str(f:0:0, s); Result := s; end; Если проекты большие/средние то это нецелесообразно делать ни для си ни для delphi. Размер rtl -> 15,5 КБ.
зачем вам эта строчка? я конечно понимаю что сначала вы берете и делаете последний знак либо 0 либо 5, что бы потом взять по модулю 2 в 15. Но зачем такой ранд нужен? взяли бы RDRAND/RDSEED. уже набор инструкций на выброс
Я бы попросил, это rand из стандартной сишной библиотеки, но он довольно всратый, да, даже для линейного конгруэнтного генератора. --- Сообщение объединено, 13 июн 2026 в 23:40 --- Стандартная сишная библиотека уже есть в системе. В венде есть msvcrt.dll, которая есть во всех версиях, хоть она очень старая в плане стандарта. Какие-то реализации есть в других системных библиотеках, типа lstrlenA. Нужны ли тебе эти знания - нет.
Не об этом речь идет. После избавления от сишной rtl есть логические ошибки, при перестроении перепрыгивает сразу на 2 позиции. Вообще интересно. Может соберу delphi версию без rtl и сишных глюков. Буду оттуда функи подгружать. Здесь на форуме вроде готовая реализация кода была для pascal/delphi. shlwapi.dll Интересно какие функции реализованы в сишной и паскалевой rtl' ке. --- Сообщение объединено, 14 июн 2026 в 00:14 --- --- Сообщение объединено, 14 июн 2026 в 00:18 --- --- Сообщение объединено, 14 июн 2026 в 00:23 --- Код (Pascal): // Базовые классы TObject // Основа всего TPersistent // Сериализация свойств TInterfacedObject // Для интерфейсов // Управление памятью GetMem, FreeMem, ReallocMem New, Dispose Initialize, Finalize // Variant (COM-совместимые типы) VarClear, VarCopy, VarArrayCreate, VarIsNull, VarIsEmpty // RTTI (интроспекция) GetTypeData, GetPropInfo, SetPropValue, ObjectIsClass // Многопоточность BeginThread, EndThread, SuspendThread, ResumeThread // Файловый ввод/вывод (старый стиль Pascal) AssignFile, Rewrite, Reset, Read, Write, CloseFile Eof, Eoln, Seek, FilePos, FileSize ReadLn, WriteLn, Append // Управление приложением Exit, Halt, RunError ParamStr, ParamCount CmdLine // Инициализация модулей InitProc, Initialization, Finalization Код (Pascal): // Преобразование типов IntToStr, StrToInt, StrToIntDef FloatToStr, StrToFloat BoolToStr, StrToBool DateTimeToStr, StrToDateTime // Форматирование Format // аналог sprintf FormatDateTime FormatFloat // Строковые функции AnsiUpperCase, AnsiLowerCase Trim, TrimLeft, TrimRight QuotedStr, AnsiQuotedStr StringReplace, AnsiReplaceStr // Сравнение строк CompareStr, CompareText, SameText, AnsiSameText // Файловая система FileExists, DirectoryExists DeleteFile, RenameFile GetCurrentDir, SetCurrentDir, CreateDir, RemoveDir ForceDirectories FileGetAttr, FileSetAttr FileSearch, ExtractFilePath, ExtractFileName, ChangeFileExt // Даты и время Now, Date, Time EncodeDate, EncodeTime DecodeDate, DecodeTime DayOfWeek, DateToStr, TimeToStr // Исключения Exception EAbort, EConvertError, EDivByZero, ERangeError TryStrToInt, TryStrToFloat // безопасное преобразование // Прочее Beep RandomRange, RandomFrom (вместе с Math) --- Сообщение объединено, 14 июн 2026 в 00:27 --- Стандартная библиотека C (ISO C) — полный список по категориям Типы данных и определения ```c // Стандартные типы (stddef.h) size_t // беззнаковый тип для размеров ptrdiff_t // знаковый тип для разности указателей wchar_t // широкий символ NULL // нулевой указатель offsetof() // смещение поля в структуре // Целочисленные типы фиксированной разрядности (stdint.h) int8_t, uint8_t int16_t, uint16_t int32_t, uint32_t int64_t, uint64_t intptr_t, uintptr_t // Булев тип (stdbool.h) bool // тип (C99) true, false // значения ``` Управление памятью ```c // Выделение и освобождение (stdlib.h) malloc() // выделение блока calloc() // выделение с обнулением realloc() // изменение размера free() // освобождение alloca() // выделение на стеке (нестандартное, но везде есть) ``` Ввод/вывод (stdio.h) ```c // Стандартные потоки stdin, stdout, stderr // Форматированный вывод printf() // вывод в stdout fprintf() // вывод в файл sprintf() // вывод в строку snprintf() // безопасная версия (C99) vprintf() // версия с va_list // Форматированный ввод scanf() // ввод из stdin fscanf() // ввод из файла sscanf() // ввод из строки // Символьный ввод/вывод getchar() // символ из stdin putchar() // символ в stdout getc(), fgetc() // символ из файла putc(), fputc() // символ в файл ungetc() // вернуть символ обратно // Строчный ввод/вывод gets() // строка из stdin (опасный, устарел) fgets() // строка из файла puts() // строка в stdout fputs() // строка в файл // Блочный ввод/вывод fread() // чтение блока данных fwrite() // запись блока данных // Работа с файлами fopen() // открыть файл freopen() // перенаправить поток fclose() // закрыть файл fflush() // сбросить буфер fseek() // переместить указатель ftell() // позиция указателя rewind() // в начало файла fgetpos() // получить позицию fsetpos() // установить позицию feof() // проверка на конец файла ferror() // проверка ошибки clearerr() // сбросить флаги ошибок remove() // удалить файл rename() // переименовать файл tmpfile() // создать временный файл tmpnam() // сгенерировать имя временного файла setbuf() // установить буфер setvbuf() // установить буфер с параметрами ``` Работа со строками (string.h) ```c // Длина строки strlen() // длина строки strnlen() // ограниченная длина (GNU/POSIX) // Копирование strcpy() // копирование строки strncpy() // копирование с ограничением strdup() // дублирование (POSIX, нестандартный) memcpy() // копирование памяти memmove() // копирование с перекрытием // Конкатенация strcat() // объединение строк strncat() // объединение с ограничением // Сравнение strcmp() // сравнение строк strncmp() // сравнение с ограничением strcoll() // сравнение с учётом локали strxfrm() // преобразование для сравнения memcmp() // сравнение памяти // Поиск strchr() // символ в строке strrchr() // последний символ strstr() // подстрока в строке strspn() // длина начального сегмента strcspn() // длина до первого совпадения strpbrk() // поиск любого символа strtok() // разбиение на токены strtok_r() // реентерабельная версия memchr() // поиск байта в памяти // Заполнение memset() // заполнить память strerror() // текст ошибки по номеру ``` Преобразование типов (stdlib.h) ```c // Строка → число atoi() // строка → int atol() // строка → long atoll() // строка → long long (C99) atof() // строка → double strtol() // строка → long (с проверкой) strtoll() // строка → long long (C99) strtoul() // строка → unsigned long strtoull() // строка → unsigned long long (C99) strtod() // строка → double strtof() // строка → float (C99) strtold() // строка → long double (C99) // Число → строка // В стандартной библиотеке нет прямых функций, только sprintf ``` Генерация случайных чисел (stdlib.h) ```c rand() // псевдослучайное число srand() // инициализация генератора RAND_MAX // максимальное значение rand() ``` Алгоритмы и поиск (stdlib.h) ```c qsort() // быстрая сортировка bsearch() // бинарный поиск ``` Математические функции (math.h) ```c // Тригонометрия sin(), cos(), tan() asin(), acos(), atan() atan2() // арктангенс с двумя аргументами // Гиперболические sinh(), cosh(), tanh() // Экспоненты и логарифмы exp() // e^x log() // натуральный логарифм log10() // десятичный логарифм // Степени и корни pow() // возведение в степень sqrt() // квадратный корень cbrt() // кубический корень (C99) // Округление ceil() // округление вверх floor() // округление вниз round() // округление (C99) trunc() // отбрасывание дробной части (C99) fmod() // остаток от деления modf() // целая и дробная часть // Модуль fabs() // абсолютное значение для double // Сравнение fmax(), fmin() // максимум/минимум (C99) fpclassify() // классификация чисел (C99) isfinite(), isnan() // проверки (C99) ``` Классификация символов (ctype.h) ```c isalnum() // буква или цифра isalpha() // буква isblank() // пробел или табуляция (C99) iscntrl() // управляющий символ isdigit() // цифра isgraph() // печатный символ (кроме пробела) islower() // строчная буква isprint() // печатный символ ispunct() // знак пунктуации isspace() // пробельный символ isupper() // заглавная буква isxdigit() // шестнадцатеричная цифра tolower() // преобразование в нижний регистр toupper() // преобразование в верхний регистр ``` Работа с временем (time.h) ```c // Время time() // текущее время в секундах clock() // процессорное время difftime() // разница времён // Преобразование asctime() // struct tm → строку ctime() // time_t → строку gmtime() // time_t → UTC struct tm localtime() // time_t → локальное struct tm mktime() // struct tm → time_t strftime() // форматированное время в строку // Константы CLOCKS_PER_SEC // тиков clock() в секунде TIME_UTC // база для timespec_get() (C11) ``` Управление программой (stdlib.h) ```c // Завершение программы exit() // нормальное завершение abort() // аварийное завершение atexit() // регистрация функции при выходе _exit() // немедленное завершение (POSIX) ExitProcess() // Windows API // Переменные окружения getenv() // получить переменную окружения setenv() // установить (POSIX) putenv() // установить (POSIX) // Выполнение команд system() // выполнить системную команду // Консольный ввод/вывод (устаревшее) getch(), getche() // ввод без ожидания Enter (нестандартные) kbhit() // проверка нажатия клавиши (нестандартная) ``` Обработка ошибок (errno.h, assert.h) ```c // Коды ошибок errno // глобальная переменная EDOM, ERANGE // константы perror() // вывод сообщения об ошибке // Диагностика assert() // макрос проверки условия static_assert() // проверка на этапе компиляции (C11) ``` Работа с сигналами (signal.h) ```c signal() // установить обработчик сигнала raise() // отправить сигнал текущему процессу // Стандартные сигналы SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM ``` Нелокальные переходы (setjmp.h) ```c setjmp() // сохранить контекст longjmp() // восстановить контекст (прыжок) jmp_buf // тип для сохранения контекста ``` Переменное число аргументов (stdarg.h) ```c va_list // тип для списка аргументов va_start() // начало обхода va_arg() // взять следующий аргумент va_end() // завершить обход va_copy() // скопировать список (C99) ``` Локализация (locale.h) ```c setlocale() // установить локаль localeconv() // получить настройки локали struct lconv // структура с настройками ``` Комплексные числа (complex.h, C99) ```c complex // тип I // мнимая единица creal() // действительная часть cimag() // мнимая часть cabs() // модуль carg() // аргумент (фаза) cproj() // проекция на сферу Римана ``` Многопоточность (threads.h, C11) ```c thrd_t // идентификатор потока thrd_create() // создание потока thrd_join() // ожидание потока thrd_exit() // завершение потока thrd_current() // идентификатор текущего потока mtx_t // мьютекс mtx_init() // инициализация mtx_lock() // захват mtx_unlock() // освобождение cnd_t // условная переменная cnd_wait() // ожидание cnd_signal() // сигнал одному cnd_broadcast() // сигнал всем tss_t // локальное хранилище потока call_once() // однократный вызов (как std::call_once) ``` Атомарные операции (stdatomic.h, C11) ```c atomic_int // атомарный int atomic_bool // атомарный bool atomic_load() // атомарное чтение atomic_store() // атомарная запись atomic_fetch_add() // атомарное прибавление atomic_compare_exchange() // CAS операция ``` --- ❌ Что НЕ является RTL C (частая путаница) ```c // Не входят в стандартную библиотеку C fork() // POSIX pipe() // POSIX socket() // Беркли сокеты select() // POSIX pthread_*() // POSIX threads (не C11 threads) dlopen() // POSIX mmap() // POSIX CreateWindow() // WinAPI MessageBox() // WinAPI GetProcAddress() // WinAPI XOpenDisplay() // X11 glBegin() // OpenGL ``` ---
Код (ASM): .386P ifndef MASM model flat, c LOCALS endif ASSUME CS: FLAT, DS: FLAT, SS: FLAT, ES: FLAT ;---------------------------------------------------------------------- _TEXT SEGMENT PUBLIC DWORD USE32 PUBLIC 'CODE' _TEXT ENDS ;---------------------------------------------------------------------- _TEXT SEGMENT PUBLIC DWORD USE32 PUBLIC 'CODE' EXTRN _MyRealWinMain:NEAR _TEXT ENDS ;---------------------------------------------------------------------- _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' public stdcall WinMain WinMain PROC NEAR jmp _MyRealWinMain WinMain ENDP _TEXT ENDS END Код (C): #include <windows.h> #pragma hdrstop extern "C" int _MyRealWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char* cppBuffer = new char[1024]; lstrcpyA(cppBuffer, "C++ Runtime is fully working!\n\n"); lstrcatA(cppBuffer, "- Transited via TASM jmp: OK\n"); lstrcatA(cppBuffer, "- Standard c0w32.obj startup: Active\n"); lstrcatA(cppBuffer, "- Operator 'new' and 'delete': OK"); MessageBoxA(NULL, cppBuffer, "C++ Bare Metal", MB_OK | MB_ICONINFORMATION); delete[] cppBuffer; return 0; } При отрезании VCL из exe, полученного старой версией C++ Builder получился размер 51kb, при этом оба рантайма (С/C++) на месте, а пустой VCL проект занимает 335kb. Просил сначала у гугл ИИ,который не gemini, вырезать VCL, но при этом оставить класс Ansistring, который находится в файлах dstring.cpp и dstring.h, но не собралось.
Собрать краулер/поисковик по текстовым файлам(.c, .h), и с помощью него находить все зависимости по типам/именам функций.