Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/78: Рейтинг темы: голосов - 78, средняя оценка - 4.62
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4

Почему при выделении памяти VirtualAlloc() в диспетчере задач не происходит скачок?

24.10.2020, 01:54. Показов 15495. Ответов 79
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для эксперимента я прошу примерно 50 байт, может немного больше.
C++
1
2
3
4
5
6
int zx=600000000;
char*aa=new char[zx] ;
cout<<"aa "<<(int)aa<<endl;
 
cin>>*aa;cout<<"aa0 "<<(int)*aa<<endl;
delete[]aa;
Происходит скачок примерно на эту величину.
Если так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int zx=600000000;
    int*p=NULL;
    p=(int*)VirtualAlloc(0,zx,MEM_TOP_DOWN  ,PAGE_READWRITE);//MEM_COMMIT 
    if (p)
    {
        cout << "OK Alloc " << endl;
cin>>*p;cout<<"p "<<*p<<en;
if (VirtualFree(p,0,MEM_RELEASE))
            cout << "Ok Free";
        else
            cout << "Not Free" << endl;
    }
    else
        cout << "Error Alloc " << endl;
cin употребляется для задержки чтобы наблюдать за диспетчером задач пока память не освобождена, далее вводим любое число и срабатываю функции освобождения памяти. В диспетчере задач не наблюдается никаких скачков VirtualAlloc специфическая функция, вполне возможно что она даже не выделяет память а резервирует или выделяет её на жёстком диске.
Может ли она выделять физическую память?
Какой флаг лучше использовать MEM_TOP_DOWN или MEM_COMMIT?

Добавлено через 1 минуту
Почему в VirtualFree передаём размер памяти 0 чтобы её освободить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2020, 01:54
Ответы с готовыми решениями:

Почему происходит ошибка при выделении памяти под массив?
Всем привет, почему я не могу выделить память под массив? Вот моя задача : Написать программу, которая реализует метод закрытого...

Что происходит за кулисами при выделении памяти для переменной?
Здравствуйте, уважаемые форумчане! У меня такой вопрос: &quot;Что происходит, когда я объявляю переменную? Я думаю, что когда я объявляю...

Почему при выделении памяти перед malloc явно указывают тип?
Вопрос в заголовке темы. Почему пишут так: short length = 5; char *buffer = (char*)malloc(sizeof(char) * length); Можно же...

79
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
25.10.2020, 17:59
Студворк — интернет-сервис помощи студентам
Это не тот показатель, который Ваша программа может самостоятельно контролировать.
Хотя, конечно, своими действиями или бездействием может косвенно побудить менеджер памяти ОС выделять и освобождать страницы физической памяти.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
31.12.2020, 02:29  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
NtAllocateVirtualMemory
Эта функция похожа на VirtualAlloc() тоже выделяет виртуальную страницу как резервную и при этом не проецирует на физическую, а проецирует после когда эта память начинает использоваться(грубо говоря)?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.12.2020, 07:03
В системах с виртуальной памятью страницы виртуальной памяти процесса обычно проецируются на физическую по page fault'у при попытке обращения к этим страницам.
Как те страницы, в которых загрузчик разместил исполняемые инструкции и данные программы при загрузке исполняемого объектного файла, так и те, которые программа позже попыталась выделить с помощью таких функций, как malloc().
Если спроецированная страница долго не используется, то ОС при необходимости может освободить физическую страницу, предварительно сохранив содержимое во "внешнее" хранилище, если процесс успел изменил её содержимое.

Небольшие участки физической памяти можно выделить с помощью специальных платформозависимых функций. Обычно прикладные программы этого не делают.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
31.12.2020, 09:27
Цитата Сообщение от Nexi99 Посмотреть сообщение
выделяет виртуальную страницу как резервную и при этом не проецирует на физическую, а проецирует после когда эта память начинает использоваться
в Windows никакая юзермодная функция не имеет доступа к физической памяти, это привилегия ядра.
пользователь оперирует только виртуальной памятью - и обертки в виде VirtualAlloc и Nt заглушки, всё это юзерские функции.
управление ядру передаётся после syscall (int 2e), и там уже функции типа Mm обращаются к озу.
1
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
31.12.2020, 19:42  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
после syscall (int 2e), и там уже функции типа Mm обращаются к озу.
Ну да там целая куча этих нижестоящих механизмов ну и конечно понятно что тут уже система сама будем смотреть проецировать на физическую память или использовать виртуальную. Короче очень объёмная эта тема.
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
04.01.2021, 10:27
Цитата Сообщение от Nexi99 Посмотреть сообщение
очень объёмная эта тема
да, механизм передачи юзермодного контекста ядру и обратно достаточно сложен.
давно уже собирался и как только будет время в новом году, сделаю блог по этой теме.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
14.01.2021, 21:24
Цитата Сообщение от Nexi99 Посмотреть сообщение
Какой флаг лучше использовать MEM_TOP_DOWN или MEM_COMMIT?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
#include <utility>
#include <stdio.h>
 
#define P(A) { A, #A },
 
std::pair< int , const char* >  flags []{
    P(MEM_RESERVE)
    P(MEM_COMMIT)
    P(MEM_RESET)
 P(MEM_TOP_DOWN)
 P(MEM_WRITE_WATCH)
 P(MEM_PHYSICAL)
 P(MEM_ROTATE)
 P(MEM_DIFFERENT_IMAGE_BASE_OK)
 P(MEM_RESET_UNDO)
 P(MEM_LARGE_PAGES)
 P(MEM_4MB_PAGES)
 P(MEM_64K_PAGES)
 P(MEM_UNMAP_WITH_TRANSIENT_BOOST)
 P(MEM_COALESCE_PLACEHOLDERS)
 P(MEM_PRESERVE_PLACEHOLDER)
 P(MEM_DECOMMIT)
 P(MEM_RELEASE)
 P(MEM_FREE)
};
 
int
main() try{
 
    constexpr auto size { 060000 };
    for ( auto a : flags ){
        auto p { VirtualAlloc( 0, size, 
            a.first, PAGE_READWRITE  ) };
        
        printf( "%s(%x): \t%p\n", 
            a.second,
            a.first,
            p );
 
    }
} catch ( ... ) {
    /// printf("");
}


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MEM_RESERVE(2000):      000001B9559E0000
MEM_COMMIT(1000):       000001B9559F0000
MEM_RESET(80000):       0000000000000000
MEM_TOP_DOWN(100000):   0000000000000000
MEM_WRITE_WATCH(200000):        0000000000000000
MEM_PHYSICAL(400000):   0000000000000000
MEM_ROTATE(800000):     0000000000000000
MEM_DIFFERENT_IMAGE_BASE_OK(800000):    0000000000000000
MEM_RESET_UNDO(1000000):        0000000000000000
MEM_LARGE_PAGES(20000000):      0000000000000000
MEM_4MB_PAGES(80000000):        0000000000000000
MEM_64K_PAGES(20400000):        0000000000000000
MEM_UNMAP_WITH_TRANSIENT_BOOST(1):      0000000000000000
MEM_COALESCE_PLACEHOLDERS(1):   0000000000000000
MEM_PRESERVE_PLACEHOLDER(2):    0000000000000000
MEM_DECOMMIT(4000):     0000000000000000
MEM_RELEASE(8000):      0000000000000000
MEM_FREE(10000):        0000000000000000
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
14.01.2021, 21:41  [ТС]
И какое назначение у этого кода можете закоментировать кратко?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
15.01.2021, 14:39
Методом тыка ( подбором комбинации флагов ) помочь ответить на один из Ваших вопросов:
Цитата Сообщение от Nexi99 Посмотреть сообщение
Какой флаг лучше использовать MEM_TOP_DOWN или MEM_COMMIT?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
12.06.2021, 00:39  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
ну а чем NtAllocateVirtualMemory не подходит?
Я так понял что она тоже резервирует память? Вовсе не означает если вызовешь функцию то получишь что нужно, я так понимаю что эта функция отчитывается перед системой.
Значит есть какаета функция которая говорит системе что память захвачена, чтобы диспетчер памяти всё выел как надо? Если в страницах которые будут даны вызовом функции памяти хватит то нужно увидеть это как-то в диспетчере задач что произошёл скачок. Вот полезная функция GetPerformanceInfo она заполняет структуру там указывается сколько страниц осталось и т.д. а вот в байтах считает
C++
1
2
MEMORYSTATUS STAT;
GlobalMemoryStatus(&STAT);
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
12.06.2021, 09:52
Цитата Сообщение от Nexi99 Посмотреть сообщение
на тоже резервирует память?
reserves, commits, or both
Цитата Сообщение от Nexi99 Посмотреть сообщение
есть какаета функция которая говорит системе что память захвачена
Система ведёт таблицу для каждого процесса, в которой перечислены все области адресного пространства этого процесса, и каки страницы в них заняты, какие свободны, какие зарезервированы и для чего.
Цитата Сообщение от Nexi99 Посмотреть сообщение
нужно увидеть это как-то в диспетчере задач что произошёл скачок
Скачок какогого показателя нужно увидеть в диспетчере задач?
Цитата Сообщение от Nexi99 Посмотреть сообщение
чтобы диспетчер памяти всё выел как надо
Что нужно выесть диспетчеру памяти?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
12.06.2021, 19:57  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Скачок какогого показателя нужно увидеть в диспетчере задач?
Ну если память выделять new то в диспетчере задач можно увидеть что система потребляет больше памяти.
Если ВиртуалАлок то такого скачка не происходит. А что будет с функцией NtAllocateVirtualMemory?
Цитата Сообщение от politoto Посмотреть сообщение
Система ведёт таблицу для каждого процесса, в которой перечислены все области адресного пространства этого процесса, и каки страницы в них заняты, какие свободны, какие зарезервированы и для чего.
Ну да есть функции которые выводят эту информацию, там и в байтах можно смотреть и в страницах.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
15.06.2021, 13:26
Цитата Сообщение от Nexi99 Посмотреть сообщение
если память выделять new то в диспетчере задач можно увидеть что система потребляет больше памяти.
Это зависит от того, как написан используемый в программе operator new и как он вызывается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <windows.h>
 
const size_t alloc{ 010 * 010000 * 010000 };
 
int main()
{
    static MEMORYSTATUSEX memInfo { sizeof memInfo,},
        newInfo{ sizeof newInfo };
    if (!GlobalMemoryStatusEx(&memInfo))
        return -1;
 
    auto dyn{ new char[alloc] };
 
    if (!GlobalMemoryStatusEx(&newInfo))
        return -1;
 
    std::cout 
        << std::oct << memInfo.ullAvailPhys - newInfo.ullAvailPhys << '\n'
        << std::oct << memInfo.ullAvailPageFile - newInfo.ullAvailPageFile << '\n'
        << std::oct << newInfo.dwMemoryLoad - memInfo.dwMemoryLoad 
        << std::endl;
 
    return 0;
}
Количество страниц физической памяти меняется незначительно, а "скачок" в использовании PageFile соответсвует выделнному объёму + служебные страницы для организации кучи.
Code
1
2
3
420000
1001010000
0
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
15.06.2021, 15:15  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Это зависит от того, как написан используемый в программе operator new и как он вызывается.
Т.е. этот скачок происходит не у всех? Я читал что там ещё есть нюанс направлен ли указатель на эту память или нет, но там тоже очень сложно всё переварить.
У Меня new и maloc дают скачок, ВиртуалАлок нет.
Если я правильно понял виртуальная память возникает на ЖД а потом по возможности переносится в ОЗУ. Может не так понял.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
15.06.2021, 15:54
Цитата Сообщение от Nexi99 Посмотреть сообщение
У Меня new и maloc дают скачок,
Скачок в окошке Task Manager?
Попробуйте собрать и потестировать конфигурацию Release.
Отладочные версии стандартных библиотек делают очень много лишнего.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
15.06.2021, 19:57  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Скачок в окошке Task Manager?
Ну да. Я вот не знаю всё ли так работает и отображает такие скачки.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
15.06.2021, 21:24
Если не получается настроить сборку, можно подложить свои new-delete, которые не вызывают библиотечные malloc***(), чтобы понаблюдать за скачками.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <windows.h>
 
const size_t alloc{ 0100 * 010000 * 010000 };
 
//* 
void* operator new  ( size_t size )
{
    return HeapAlloc( GetProcessHeap(), 0, size );
}
 
void operator delete  ( void * p)
{
    HeapFree( GetProcessHeap(), 0, p );
}
//*/
 
int main()
{
    static MEMORYSTATUSEX memInfo { sizeof memInfo,},
        newInfo{ sizeof newInfo };
    if (!GlobalMemoryStatusEx(&memInfo))
        return -1;
 
    auto dyn{ new char[alloc] };
 
    if (!GlobalMemoryStatusEx(&newInfo))
        return -1;
 
    std::cout 
        << std::oct << memInfo.ullAvailPhys - newInfo.ullAvailPhys << '\n'
        << std::oct << memInfo.ullAvailPageFile - newInfo.ullAvailPageFile << '\n'
        << std::oct << newInfo.dwMemoryLoad - memInfo.dwMemoryLoad  << '\n'
    << static_cast<void*>(dyn) 
        << std::endl;
 
    int n;
     std::cin >> n; //  пауза для диагностики
    
    char c {};
    for ( auto d = dyn; d != dyn + alloc; d += 010000 )
    {
        c^=*d;      
    }
 
 
   if (!GlobalMemoryStatusEx(&newInfo))
        return -1;
 
    std::cout 
        << std::oct << memInfo.ullAvailPhys - newInfo.ullAvailPhys << '\n'
        << std::oct << memInfo.ullAvailPageFile - newInfo.ullAvailPageFile << '\n'
        << std::oct << newInfo.dwMemoryLoad - memInfo.dwMemoryLoad  << '\n'
    << static_cast<void*>(dyn) 
        << std::endl;
 
    std::cin >> n;
 
    return c;
}
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.06.2021, 13:42
Видно, как во время работы процесса со статическим массивом для него по pagefault'ам выделяются страницы физической памяти.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
 
void PrintCurrentProcessMemoryInfo()
{
 
    HANDLE this = GetCurrentProcess();
    PROCESS_MEMORY_COUNTERS pmc;
 
    // Print the process identifier.
 
    printf("\nProcess ID: %u\n", GetCurrentProcessId());
 
    // Print information about the memory usage of the process.
 
 
    if (GetProcessMemoryInfo(this, &pmc, sizeof(pmc)))
    {
        printf("\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount);
        printf("\tPeakWorkingSetSize: 0x%08X\n",
            pmc.PeakWorkingSetSize);
        printf("\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize);
        //printf("\tQuotaPeakPagedPoolUsage: 0x%08X\n",
        //    pmc.QuotaPeakPagedPoolUsage);
        //printf("\tQuotaPagedPoolUsage: 0x%08X\n",
        //    pmc.QuotaPagedPoolUsage);
        //printf("\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
        //    pmc.QuotaPeakNonPagedPoolUsage);
        //printf("\tQuotaNonPagedPoolUsage: 0x%08X\n",
        //    pmc.QuotaNonPagedPoolUsage);
        printf("\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage);
        printf("\tPeakPagefileUsage: 0x%08X\n",
            pmc.PeakPagefileUsage);
    }
 
}
 
int main()
{
 
    static char stat[070 * 010000 * 010000] = { 0 };
 
    PrintCurrentProcessMemoryInfo();
 
    // работаем со страницами stat
 
    char total = '\0';
    for (size_t offset = 0; offset < sizeof stat; offset += 010000) {
        total ^= stat[offset];
    }
 
    PrintCurrentProcessMemoryInfo();
 
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Process ID : 17176
PageFaultCount : 0x00000562
PeakWorkingSetSize : 0x0036B000
WorkingSetSize : 0x0036A000
PagefileUsage : 0x38254000
PeakPagefileUsage : 0x38254000
 
Process ID : 17176
PageFaultCount : 0x00038561
PeakWorkingSetSize : 0x3836A000
WorkingSetSize : 0x38369000
PagefileUsage : 0x38254000
PeakPagefileUsage : 0x38254000
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
17.06.2021, 15:32  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
выделяются страницы физической памяти.
Выделение страниц вовсе не означает что этот скачёк будет. Там нужно создание указателя и обращение к ним. В общем это всё нужно тестировать и изучать. Очень обширный вопрос.
Как освободить память/(страницы) запрошенную функцией NtAllocateVirtualMemory?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.06.2021, 17:46
Цитата Сообщение от Nexi99 Посмотреть сообщение
Выделение страниц вовсе не означает что этот скачёк будет.
Конечно. Более 100% памяти физически использовать невозможно. Рано или поздно, когда для продолжения работы процесса понадобится новая страница, чтобы считать оттуда данные или выполнить инструкцию, менеджер памяти будет исключать из рабочих наборов те страницы, с которымы процессы активно не работают, и долго не использовавшиеся страницы, используемые для кэширования содержимого других файлов, а в освободившиеся страницы считать код или данные с SSD и отобразить их по нужным адресам в адресное пространство, чтобы процессор, на котором выполняется поток процесса, мог с ними работать.
При этом общее число используемых страниц останется примерно тем же.

Поэтому, нужно следить за рабочими наборами ( WorkingSet ) исследуемых процессов (GetProcessMemoryInfo() https://docs.microsoft.com/en-... -a-process), а не только за общим объёмом выделенной памяти в системе (GlobalMemoryStatusEx() https://docs.microsoft.com/en-... rystatusex).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2021, 17:46
Помогаю со студенческими работами здесь

При пользовании любым приложением в диспетчере задач 3 гб озу, вылазит табличка о недостатке памяти
При использовании любым приложением в диспетчере задач 3 гб озу, вылазит табличка о недостатке памяти и приложение зависает или выключается...

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под динамические массивы. При создании массива более программа вылетает...

При закрытом диспетчере задач процессор грузится до 60-100%, при открытии диспетчере падает до 10%
При закрытом диспетчере задач процессор грузится до 60-100%, при открытии диспетчере падает до 10%.При закрытом смотрел через HWMonitor,...

Загруженность памяти в диспетчере задач
Здравствуйте, около недели назад решила обновить себе мат. плату с Gigabyte Technology Co., Ltd. H97-D3H-CF на MSI Z97 GAMING 3. Так же я...

Вопросы по отображению данных оперативной памяти в диспетчере задач
Не подскажете что за цифры, мне казалось что доступно должно показывать 8гб поскольку у меня озу 8гб, а тут меньше написано. Либо я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru