Как C++ поддерживает потоки под капотом?

Я работаю над программой, в которой я пытался использовать stringstream и немного запутался в том, как на самом деле работают потоки.

Рассмотрим это, например:

    char * dataset = new char[3000];
    stringstream buff;
    for (unsigned int i = 0; i < 3000; ++i)
        if (dataset[i] != 32)
            buff.put(dataset[i]);
    delete[] dataset;
    string temp = buff.str();

Другой способ сделать это будет:

    char * dataset = new char[3000];

    //Count the number of spaces
    unsigned int unwanted = 0;
    for (unsigned int i = 0; i < 3000; ++i)
        if (dataset[i] == 32)
            ++unwanted;

    //Copy all characters other than spaces
    char * temp = new char[3000 - unwanted];
    for (unsigned int i = 0, j = 0; i < 3000 - unwanted; ++j)
        if (dataset[j] != 32)
            temp[i++] = dataset[j];
    delete[] dataset;
    dataset = temp;

Теперь путаница вот в этом:

Как потоки могут продолжать принимать символы и не заботиться о размере? Я имею в виду, что я просто продолжаю помещать символ, и он продолжает добавлять в буфер потока. Моя интуиция также говорит мне, что потоки, вероятно, не поддерживают строку или подобную структуру данных под капотом, которую они могут расширять, если достигают предела размера.

Так что именно движет этими потоками? Я имею в виду, какая структура данных работает под этими потоками. И у нас даже есть ограничение размера потока или мы можем просто продолжать добавлять, не заботясь о превышении размера?

Наконец, из вышеупомянутых двух методов, который был бы лучшим. Я попытался профилировать оба массива из 147 тыс. Символов, и второй, похоже, работал лучше.

0 ответов

Другие вопросы по тегам