Если я предварительно выделяю станд.:: stringstream?

Ваш код перезаписывает переменную «Images» в цикле for, и только последний экземпляр цикла сохраняется в изображениях. Также вы определили изображения дважды?

Попробуйте изменить код так:

   function hello(f,d)
{
alert(f,d);
}

var Images = document.querySelectorAll('.block-image_carousel-single > figcaption');
for (var i = 0; i < Images.length; i++) {

Images[i].addEventListener('click', function (event) { 
event.preventDefault();

hello(this, Images.textContent);
},false);
}
22
задан Mateen Ulhaq 17 December 2011 в 20:19
поделиться

2 ответа

Вы профилировали свое выполнение и обнаружили, что они являются источником медленных вниз?

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

Что касается резервирования места ...

Некоторые реализации, вероятно, резервируют небольшой буфер до того, как какое-либо выделение будет выполнено для потока строк. Многие реализации std :: string делают это.

Другой вариант может быть (непроверен!)

std::string str;
str.reserve(50);
std::stringstream sstr(str);

Вы можете найти еще несколько идей в этой ветке разработки .

edit:

Mucking вокруг stringstream rdbuf также может быть решением. Этот подход, вероятно, очень легко ошибиться, поэтому, пожалуйста, убедитесь, что это так » абсолютно необходимо . Определенно не элегантно и не лаконично.

10
ответ дан 29 November 2019 в 05:54
поделиться

Плохое

Это - старый вопрос, но как раз когда из C++ 1z/C ++ 2a в Visual Studio 2019, stringstream не имеет никакого идеального способа зарезервировать буфер.

другие ответы на этот вопрос не работают вообще и по следующим причинам:

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

  • seekp на stringstream все еще, кажется, неопределенное поведение и/или ничего не делает.

Польза

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

std::string dummy(reserve, '\0');
std::stringstream ss(dummy);
dummy.clear();
dummy.shrink_to_fit();

код может также быть написан как острота std::stringstream ss(std::string(reserve, '\0'));.

Ужасное

, Что действительно происходит в этом сегменте кода, следующее:

  • dummy предварительно выделяется с резервом, и буфер впоследствии заполнен пустыми байтами (требуемый для конструктора).
  • stringstream создается с макетом. Это копирует содержание всей строки во внутренний буфер, который предварительно выделяется.
  • dummy затем очищен и затем стерт, освобождая его выделение.

Это означает, что для предварительного выделения stringstream, два выделения, одна заливка, и одна копия происходит. Худшая часть - то, что во время выражения, вдвое больше памяти необходимо для желаемого выделения.Черт!

Для большинства вариантов использования, это не могло бы иметь значения вообще, и нормально брать дополнительную заливку и хит копии, чтобы иметь меньше перераспределений.

0
ответ дан 29 November 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: