#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
. Время выполнения вывода занимает значительно больше времени, чем добавление, и поэтому время между циклами замедляется. Это, в свою очередь, означает, что ваша оперативная память будет заполняться медленнее.