Простой цикл C занимает всю оперативную память

#c

Вопрос:

Я немного кодировал на C , просто чтобы привыкнуть к его синтаксису (я разработчик Java). Тем не менее, я написал код ниже, и он занимает всю оперативную память за считанные секунды, чем больше у вас свободной оперативной памяти, тем быстрее программа ее заполняет. Когда я раскомментирую cout метод для печати текущей строки в конце каждого цикла, он начинает занимать оперативную память значительно медленнее (10-15 МБ в минуту). Действительно ли операция печати так сильно замедляет цикл, или есть другая причина?

 #include <iostream>
#include <list>

using namespace std;


int main() {
    string inf;
    list<string> myList;

    for(;;){
        inf  = "___ ";
        myList.push_back(inf);
        //cout << inf;
    }
}
 

Комментарии:

1. Ваш цикл использует все больше и больше памяти, поэтому наблюдаемое поведение кажется логичным. Печать «медленная»…

2. что вы имеете в виду под «возвращается в нормальное состояние, заполняется медленно» ?

3. о, вы имеете в виду, что когда вы печатаете что-то на экране, программа работает медленнее, т. Е. требуется больше времени, прежде чем она взорвется? Печать чего-либо на экране происходит чрезвычайно медленно по сравнению с большинством вещей, которые вы можете выполнять на процессоре

4. Я не мог уловить логику в твоих рассуждениях.

5. Я просто добавляю простой символ в список — нет, вы добавляете копии растущей строки в список. push_back() делает копию, см. cplusplus.com/reference/list/list/push_back

Ответ №1:

ибо (;;) — это бесконечный цикл.

 for (statement 1; statement 2; statement 3) {
  // code block to be executed
}
 

Оператор 1 выполняется (один раз) до выполнения блока кода.

Оператор 2 определяет условие для выполнения блока кода.

Оператор 3 выполняется (каждый раз) после выполнения блока кода.

Поскольку ваше утверждение 2 пусто, по умолчанию оно равно true, поэтому этот цикл продолжает выполняться.

Комментарии:

1. Вы неправильно истолковали вопрос: Does printing operation slows the cycle that much, or is there another reason? — ОП спрашивает, почему использование cout вызывает разницу в скорости.

Ответ №2:

Причина, по которой это происходит, заключается просто в том, что операции ввода-вывода действительно медленные по сравнению с добавлением списка. Поэтому это казалось работой «хорошо». Этот цикл просто бесконечен, никогда не останавливается.

Ответ №3:

ваш for(;;) цикл бесконечен и, как таковой mylist , постоянно расширяется, пока не заполнит всю вашу оперативную память. Время выполнения добавления простого символа в список чрезвычайно мало, поэтому ваша оперативная память заполняется чрезвычайно быстро. При cout добавлении в цикл цикл должен выводиться, прежде чем он сможет добавить больше mylist . Время выполнения вывода занимает значительно больше времени, чем добавление, и поэтому время между циклами замедляется. Это, в свою очередь, означает, что ваша оперативная память будет заполняться медленнее.