Загадки мозга

Тема в разделе "WASM.HEAP", создана пользователем Blackbeam, 19 июн 2011.

  1. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    34
    Минимальный размер достигается из того что собирается без стандартной библиотеки.
    Если оставлять стандартную библиотеку, то самый релевантный ответ:
    --- --

    Для уменьшения размера нужно переписывать чтобы не аттачилась стандартная библиотека:
    Код (C):
    1. static unsigned int rand_seed = 0;
    2.  
    3. void my_srand(unsigned int seed) {
    4.     rand_seed = seed;
    5. }
    6.  
    7. int my_rand(void) {
    8.     rand_seed = rand_seed * 1103515245 + 12345;
    9.     return (unsigned int)(rand_seed / 65536) % 32768;
    10. }
    11.  
    12. // Прототипы функций памяти
    13. void* my_alloc(SIZE_T size);
    14. void* my_realloc(void* ptr, SIZE_T new_size);
    15. void my_free(void* ptr);
    16.  
    17. // Реализации функций работы с памятью
    18. void* my_alloc(SIZE_T size) {
    19.     return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
    20. }
    21.  
    22. void* my_realloc(void* ptr, SIZE_T new_size) {
    23.     if (ptr == NULL) {
    24.         return my_alloc(new_size);
    25.     }
    26.     if (new_size == 0) {
    27.         my_free(ptr);
    28.         return NULL;
    29.     }
    30.     return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, new_size);
    31. }
    32.  
    33. void my_free(void* ptr) {
    34.     if (ptr) HeapFree(GetProcessHeap(), 0, ptr);
    35. }
    36.  
    37. // Своя реализация strlen
    38. int my_strlen(const char* str) {
    39.     const char* s = str;
    40.     while (*s) s++;
    41.     return (int)(s - str);
    42. }
    43.  
    44. // Преобразование числа в строку
    45. void int_to_str(int num, char* buf) {
    46.     int i = 0;
    47.     int is_negative = 0;
    48.  
    49.     if (num < 0) {
    50.         is_negative = 1;
    51.         num = -num;
    52.     }
    53.  
    54.     do {
    55.         buf[i++] = '0' + (num % 10);
    56.         num /= 10;
    57.     } while (num > 0);
    58.  
    59.     if (is_negative) buf[i++] = '-';
    60.     buf[i] = '\0';
    61.  
    62.     // Reverse
    63.     for (int j = 0; j < i / 2; j++) {
    64.         char temp = buf[j];
    65.         buf[j] = buf[i - 1 - j];
    66.         buf[i - 1 - j] = temp;
    67.     }
    68. }
    Минимальный размер 9,50 КБ. На delphi примерно так же будет.
    Для delphi нужно убирать rtl код из SysInit и System и так же допиливать функции:

    Код (Pascal):
    1. function IntToStr(i: Integer): string;
    2. begin
    3.   Str(i, Result);
    4. end;
    5.  
    6. function FloatToStr(f: Real): string;
    7. var
    8.   s: string;
    9. begin
    10.   Str(f:0:0, s);
    11.   Result := s;
    12. end;
    Если проекты большие/средние то это нецелесообразно делать ни для си ни для delphi. Размер rtl -> 15,5 КБ.
     

    Вложения:

    • Minimal.rar
      Размер файла:
      8,5 КБ
      Просмотров:
      11
    Последнее редактирование: 13 июн 2026 в 23:30
  2. q2e74

    q2e74 Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    1.027
    зачем вам эта строчка? я конечно понимаю что сначала вы берете и делаете последний знак либо 0 либо 5, что бы потом взять по модулю 2 в 15. Но зачем такой ранд нужен? взяли бы RDRAND/RDSEED.

    уже набор инструкций на выброс
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.395
    Я бы попросил, это rand из стандартной сишной библиотеки, но он довольно всратый, да, даже для линейного конгруэнтного генератора.
    --- Сообщение объединено, 13 июн 2026 в 23:40 ---
    Стандартная сишная библиотека уже есть в системе. В венде есть msvcrt.dll, которая есть во всех версиях, хоть она очень старая в плане стандарта. Какие-то реализации есть в других системных библиотеках, типа lstrlenA. Нужны ли тебе эти знания - нет.
     
  4. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    34
    Не об этом речь идет. После избавления от сишной rtl есть логические ошибки, при перестроении перепрыгивает сразу на 2 позиции.
    Вообще интересно. Может соберу delphi версию без rtl и сишных глюков. Буду оттуда функи подгружать. Здесь на форуме вроде готовая реализация кода была для pascal/delphi.
    shlwapi.dll
    Интересно какие функции реализованы в сишной и паскалевой rtl' ке.
    --- Сообщение объединено, 14 июн 2026 в 00:14 ---
    --- Сообщение объединено, 14 июн 2026 в 00:18 ---
    --- Сообщение объединено, 14 июн 2026 в 00:23 ---
    Код (Pascal):
    1. // Базовые классы
    2. TObject           // Основа всего
    3. TPersistent       // Сериализация свойств
    4. TInterfacedObject // Для интерфейсов
    5.  
    6. // Управление памятью
    7. GetMem, FreeMem, ReallocMem
    8. New, Dispose
    9. Initialize, Finalize
    10.  
    11. // Variant (COM-совместимые типы)
    12. VarClear, VarCopy, VarArrayCreate, VarIsNull, VarIsEmpty
    13.  
    14. // RTTI (интроспекция)
    15. GetTypeData, GetPropInfo, SetPropValue, ObjectIsClass
    16.  
    17. // Многопоточность
    18. BeginThread, EndThread, SuspendThread, ResumeThread
    19.  
    20. // Файловый ввод/вывод (старый стиль Pascal)
    21. AssignFile, Rewrite, Reset, Read, Write, CloseFile
    22. Eof, Eoln, Seek, FilePos, FileSize
    23. ReadLn, WriteLn, Append
    24.  
    25. // Управление приложением
    26. Exit, Halt, RunError
    27. ParamStr, ParamCount
    28. CmdLine
    29.  
    30. // Инициализация модулей
    31. InitProc, Initialization, Finalization
    Код (Pascal):
    1. // Преобразование типов
    2. IntToStr, StrToInt, StrToIntDef
    3. FloatToStr, StrToFloat
    4. BoolToStr, StrToBool
    5. DateTimeToStr, StrToDateTime
    6.  
    7. // Форматирование
    8. Format // аналог sprintf
    9. FormatDateTime
    10. FormatFloat
    11.  
    12. // Строковые функции
    13. AnsiUpperCase, AnsiLowerCase
    14. Trim, TrimLeft, TrimRight
    15. QuotedStr, AnsiQuotedStr
    16. StringReplace, AnsiReplaceStr
    17.  
    18. // Сравнение строк
    19. CompareStr, CompareText, SameText, AnsiSameText
    20.  
    21. // Файловая система
    22. FileExists, DirectoryExists
    23. DeleteFile, RenameFile
    24. GetCurrentDir, SetCurrentDir, CreateDir, RemoveDir
    25. ForceDirectories
    26. FileGetAttr, FileSetAttr
    27. FileSearch, ExtractFilePath, ExtractFileName, ChangeFileExt
    28.  
    29. // Даты и время
    30. Now, Date, Time
    31. EncodeDate, EncodeTime
    32. DecodeDate, DecodeTime
    33. DayOfWeek, DateToStr, TimeToStr
    34.  
    35. // Исключения
    36. Exception
    37. EAbort, EConvertError, EDivByZero, ERangeError
    38. TryStrToInt, TryStrToFloat // безопасное преобразование
    39.  
    40. // Прочее
    41. Beep
    42. RandomRange, RandomFrom (вместе с Math)
    43.  
    --- Сообщение объединено, 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
    ```

    ---
     
    Последнее редактирование: 14 июн 2026 в 00:09
  5. schuler

    schuler New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2021
    Сообщения:
    17
    Код (ASM):
    1.  
    2.                 .386P
    3. ifndef MASM
    4.                 model flat, c          
    5. LOCALS
    6. endif
    7.                 ASSUME   CS: FLAT, DS: FLAT, SS: FLAT, ES: FLAT
    8. ;----------------------------------------------------------------------
    9. _TEXT           SEGMENT PUBLIC DWORD USE32 PUBLIC 'CODE'
    10. _TEXT           ENDS
    11. ;----------------------------------------------------------------------
    12. _TEXT           SEGMENT PUBLIC DWORD USE32 PUBLIC 'CODE'
    13. EXTRN          _MyRealWinMain:NEAR    
    14. _TEXT           ENDS
    15. ;----------------------------------------------------------------------
    16. _TEXT           SEGMENT  DWORD USE32 PUBLIC 'CODE'
    17.                 public stdcall WinMain
    18. WinMain         PROC NEAR
    19.                 jmp     _MyRealWinMain
    20. WinMain         ENDP
    21. _TEXT           ENDS
    22.                 END
    23.  
    Код (C):
    1.  
    2. #include <windows.h>
    3. #pragma hdrstop
    4. extern "C" int _MyRealWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    5. {
    6.     char* cppBuffer = new char[1024];
    7.  
    8.     lstrcpyA(cppBuffer, "C++ Runtime is fully working!\n\n");
    9.     lstrcatA(cppBuffer, "- Transited via TASM jmp: OK\n");
    10.     lstrcatA(cppBuffer, "- Standard c0w32.obj startup: Active\n");
    11.     lstrcatA(cppBuffer, "- Operator 'new' and 'delete': OK");
    12.     MessageBoxA(NULL, cppBuffer, "C++ Bare Metal", MB_OK | MB_ICONINFORMATION);
    13.     delete[] cppBuffer;
    14.     return 0;
    15. }
    16.  
    При отрезании VCL из exe, полученного старой версией C++ Builder получился
    размер 51kb, при этом оба рантайма (С/C++) на месте, а пустой VCL проект занимает 335kb. Просил сначала у гугл ИИ,который не gemini, вырезать VCL, но при этом оставить класс Ansistring, который находится в файлах dstring.cpp и dstring.h, но не собралось.
     
    Последнее редактирование: 14 июн 2026 в 03:08
  6. Tech

    Tech Member

    Публикаций:
    0
    Регистрация:
    1 апр 2026
    Сообщения:
    34
    Собрать краулер/поисковик по текстовым файлам(.c, .h), и с помощью него находить все зависимости по типам/именам функций.