<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802886</guid>
        <pubDate>Sat, 06 Jul 2019 06:48:33 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802886</link>
        <description><![CDATA[amk: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3802762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-07-05T12:08:57+03:00">05.07.19, 09:08</time></span><div class='quote '>Строка константная, изменена не будет</div></div> Создай статически, объяви константной. Если в библиотеке предусмотрено константное поведение строк, от части операций удастся избавиться. Однако перестанут вызываться функции, в которые эта строка передаётся по неконстантной ссылке. Так что константной объявить строку возможно и не получится (зато узнаешь, как часто эта строка передаётся в функции, которые её содержимое, по мнению компилятора, могут изменить, если не сейчас, то когда-нибудь в будущем, если будут переписаны).]]></description>
        <author>amk</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802766</guid>
        <pubDate>Fri, 05 Jul 2019 09:24:58 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802766</link>
        <description><![CDATA[Ирокез: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3802762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-07-05T09:08:57+00:00">05.07.19, 09:08</time></span><div class='quote '>Вопрос как раз в создании статически.</div></div>Нельзя. Да и зачем? Вы ж разменяете быстродействие процессора на вращение диска и можете даже потерять.<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3802762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-07-05T09:08:57+00:00">05.07.19, 09:08</time></span><div class='quote '>Строка константная, изменена не будет, поэтому проблем с многопоточностью нет. </div></div>А компилятор об этом знает? Даже если он способен проанализировать весь исходник, то и тогда не сможет сделать вывод о том, что других строк не появится. Может строка ровно одна <strong class='tag-b'>пока</strong>? Компилятор этого исключить не может, а авторы линкера и кодогенератора вообще не в курсе количества строк. И если строка одна, то её так и так придётся сначала создать, а потом удалить. Вот если строк миллиард, но никакие две не нужны одновременно, тогда можно, разместив их в одном и том же объекте, а меняя только его значение, сэкономить на девятьсот девяносто миллионов девятьсот девяносто девять тысяч девятьсот девяносто девяти вызовах конструктора и таком же количестве вызовов деструктора. Да и то надо ещё постараться, чтоб те же вызовы не «влезли через окно». Да и даже если бы можно было бы сэкономить единственный вызов конструктора, пользователь этого не заметит даже если он вообще не из нашей метагалактики.]]></description>
        <author>Ирокез</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802762</guid>
        <pubDate>Fri, 05 Jul 2019 09:08:57 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802762</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3802723'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Ирокез &#064; <time class="tag-quote__quoted-time" datetime="2019-07-05T07:40:31+00:00">05.07.19, 07:40</time></span><div class='quote '>Заранее создать можно, статически нельзя.</div></div>Вопрос как раз в создании статически.<br>
Строка константная, изменена не будет, поэтому проблем с многопоточностью нет.]]></description>
        <author>Jin X</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802723</guid>
        <pubDate>Fri, 05 Jul 2019 07:40:31 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3802723</link>
        <description><![CDATA[Ирокез: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800859'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T13:31:43+00:00">07.06.19, 13:31</time></span><div class='quote '>Можно ли сделать так, чтобы в EXE-шнике изначально хранился объект std::string, а не создавался перед вызовом функции?</div></div>Можно. А как Вы собиратесь привязать его к конкретному вызову конкретной функции. Хорошо, когда функция простейшая и вызывается из одного потока. Тогда до завершения одной её ветви следующий вызов не поступит. А если приложение многопоточное? Многопоточность есть многозадачность не ситемы, а отдельно взятой исполняемой под системой программы. Поток прервался посреди функции, другой поток вызвал её ещё раз с другим фактическим параметром, получили две ветви одной функции, каждая вызвана из своего потока, потом первая ветвь продолжила выполняться, а строка уже другая. Или функция рекурсивна. Такая функция, не завершившись, вызывает себя с другим фактическим параметром. Завершаясь же, такая функция возвращает управление себе. Вызвала функция себя, строка изменилась, потом функция заврешилась и вернула управление той себе, которая вызвана не из себя, а из мэйн, там строка должна быть из первого вызова, а будет из второго. К тому же копирование и удаление даже в самом кривом исполнении занимают меньше тактов, чем оптимальное копирование. Если только это действительно копирование, а не асоциирование. То есть если после <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">char s[]=&quot;какой-то текст&quot;;</div><div class="code_line">t(s);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> символы будут в двух экземплярах. Но если ты точно знаешь, что таких накладок не будет, то, в принципе, можно создать строку заранее в любом месте вызывающей функции, её модуля, или глобально, все операции, модифицирующие значение фактического параметра, выполнять прямо над самой строкой, а в функцию передавать ссылку или указатель. Только когда строк окажется всё же две разные, придётся самому позаботиться о каждой. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-07-05T07:43:32+00:00">05.07.19, 07:43</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800862'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T14:08:02+00:00">07.06.19, 14:08</time></span><div class='quote '>Нет. Объекты с нетривиальными конструкторами не могут быть созданы иначе, нежели в run-time, кроме как constexpr. </div></div>В рантайм? Или перед самым вызовом конкретной функции? Вот в чём вопрос. Заранее создать можно, статически нельзя.]]></description>
        <author>Ирокез</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3801098</guid>
        <pubDate>Tue, 11 Jun 2019 10:27:00 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3801098</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800986'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2019-06-10T13:01:18+00:00">10.06.19, 13:01</time></span><div class='quote '>Тема раскрыта, например, тут. Но я думаю, что все это преждевременная оптимизация.</div></div>Ну да, любопытно. Но заморочи много. Действительно, не всегда это надо.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800886'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T21:14:34+00:00">07.06.19, 21:14</time></span><div class='quote '>Насколько мне известно, но это неточно, в C++20 потребовали, чтобы constexpr стало обязательной инструкцией компилятору.</div></div>Инструкцией к чему?<br>
Для обязательного выполнения именно в compile time вводится <strong class='tag-b'>consteval</strong>. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-06-11T10:30:25+00:00">11.06.19, 10:30</time></span></span><br>
Кстати, что интересно, код со <strong class='tag-b'>string_view</strong> более оптимальный даже, чем с <strong class='tag-b'>char*</strong>, ибо там уже есть длина строки (странно только, что этот код не инлайнится автоматом): <a class='tag-url' href='https://godbolt.org/z/oJokK8' target='_blank'>https://godbolt.org/z/oJokK8</a> :)]]></description>
        <author>Jin X</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800986</guid>
        <pubDate>Mon, 10 Jun 2019 13:01:18 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800986</link>
        <description><![CDATA[shm: Тема раскрыта, например, <a class='tag-url' href='https://akrzemi1.wordpress.com/2017/06/28/compile-time-string-concatenation/' target='_blank'>тут</a>. Но я думаю, что все это преждевременная оптимизация.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800984</guid>
        <pubDate>Mon, 10 Jun 2019 12:04:52 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800984</link>
        <description><![CDATA[Jin X: Спасибо, <strong class='tag-b'>Qraizer</strong> за разъяснения ;)<br>
Да, я уже понял, что Clang более чётко следует стандартам.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800886'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T21:14:34+00:00">07.06.19, 21:14</time></span><div class='quote '>являясь по сути ссылочным типом, легко впоследствии может оказаться указываемым в ничто, если исходный объект будет разрушен раньше времени.</div></div>Да, я понимаю, что при передаче string это будет просто size() и c_str(), а при строковом литерале — его длина и const char* со всеми вытекающими. Так-то, и при передаче const string&amp; значение параметра может поменяться, если исходный объект будет изменён раньше времени (а если это будет динамически созданный объект, то так же может указывать в никуда). И такую строку тоже нужно копировать во избежание этого.<br>
<br>
<br>
<strong class='tag-b'>shm</strong>, это я понимаю. Но я думал, что можно в копмайл-тайм создать его, ан нет. Просто, если функция вызывается много раз с разными константными строками, всё равно их все придётся создавать динамически. И даже копировать.<br>
Не то, чтоб я прям хотел сэкономить такты, просто бессмысленность вот этого копирования (а еще ведь надо память выделить и освободить) и пр. смутила :). Что-то компилятор, конечно, соптимизирует, но это все implementation defined, как говорится.]]></description>
        <author>Jin X</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800889</guid>
        <pubDate>Sat, 08 Jun 2019 00:43:47 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800889</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800859'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T13:31:43+00:00">07.06.19, 13:31</time></span><div class='quote '>можно сделать const std::string text = &quot;Hello my dear friend&#33;&#092;n&quot;; и подставлять её, но это неинтересно. Да и всё равно объект создаётся динамически. </div></div><br>
А можно сделать static const std::string и объект будет создаваться только 1 раз (если цель в экономии тактов процессора).]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800886</guid>
        <pubDate>Fri, 07 Jun 2019 21:14:34 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800886</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800875'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T17:52:16+00:00">07.06.19, 17:52</time></span><div class='quote '>Можешь глянуть и объяснить это явление?</div></div>constexpr для функций означает лишь, что они могут использоваться в константных выражениях. Исполнение их в компайл-тайм может оказаться невозможным, но компилятор может сделать всё возможное, чтобы всё возможное выполнить при компиляции. Ошибкой будет считаться лишь невозможность породить результат т.о., чтобы в используемом контексте его можно было бы использовать. Например, если результат constexpr функции, возвращающей int, будет использовать как указание размера массива в его определении, ибо Стандарт обязывает указывать там только константные выражения, вычислимые в компайл-тайм. Так что формально в твоём случае компилятор может выполнить всю работу get_default_suffix_text(), но отложить создание результирующего объекта до ран-тайм, т.к. контекст не обязывает его предоставить результат ранее ран-тайма. Насколько мне известно, но это неточно, в C++20 потребовали, чтобы constexpr стало обязательной инструкцией компилятору. Вероятно поэтому clang и ругается. Однако C++20 пока ещё не ратифицирован. Более того, в описании constexpr среди прочего указано, что возвращаемое значение должно быть literal type, к каковым std::string явно не относится, т.к. literal type должен иметь (по меньшей мере, но не ограничиваясь) тривиальный деструктор.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800875'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T17:52:16+00:00">07.06.19, 17:52</time></span><div class='quote '>Навели на мысль заюзать string_view.</div></div>std::string_view не хранит информации, он лишь ссылается на неё, хранимую ещё где-то. В твоём случае строковый литерал вполне подходит, т.к. имеет время жизни до конца программы (static storage duration). Но в общем случае это противоречивый класс: являясь по сути ссылочным типом, легко впоследствии может оказаться указываемым в ничто, если исходный объект будет разрушен раньше времени. Зато string_view позволяет работать с собой как с constexpr.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800875</guid>
        <pubDate>Fri, 07 Jun 2019 17:52:16 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800875</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>Qraizer</strong>, я тут делаю одну штуку, в которой путём экспериментов мне удалось сделать функцию constexpr std::string. Прога компилится в GCC, VS и ICC, а вот Clang на неё ругается.<br>
Правда, когда я пытаюсь выдернуть этот кусок отдельно, то ничего не получается, компилеры ругаются как раз на constexpr std::string.<br>
<br>
Можешь глянуть и объяснить это явление?<br>
Ищи static constexpr std::string get_default_suffix_text()<br>
<br>
p.s. Эта штука не доделана, поэтому выкладываю под названием temp :)<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">[прикреплённый файл удалён]</span><br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-06-07T18:46:37+00:00">07.06.19, 18:46</time></span></span><br>
Навели на мысль заюзать string_view.<br>
Выглядите куда веселее: <a class='tag-url' href='https://godbolt.org/z/XAm-S-' target='_blank'>https://godbolt.org/z/XAm-S-</a><br>
Жаль только, что C++17.]]></description>
        <author>Jin X</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800862</guid>
        <pubDate>Fri, 07 Jun 2019 14:08:02 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800862</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800859'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T13:31:43+00:00">07.06.19, 13:31</time></span><div class='quote '>Что происходит?<br>
...</div></div>Почти. Создаётся временный std::string (r-value), который успешно биндится на константную l-value ссылку, и чьё время жизни заканчивается по достижению ;, т.е. по возврату из test().<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414983&view=findpost&p=3800859'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2019-06-07T13:31:43+00:00">07.06.19, 13:31</time></span><div class='quote '>Можно ли сделать так, чтобы в EXE-шнике изначально хранился объект <strong class='tag-b'>std::string</strong>, а не создавался перед вызовом функции?</div></div>Нет. Объекты с нетривиальными конструкторами не могут быть созданы иначе, нежели в run-time, кроме как constexpr. Конкретно std::string требует наличия хипа для связи указателей с хранилищем dynamic storage, поэтому не может иметь constexpr конструкторов.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800859</guid>
        <pubDate>Fri, 07 Jun 2019 13:31:43 +0000</pubDate>
        <title>Передача строки в качестве параметра</title>
        <link>https://forum.sources.ru/index.php?showtopic=414983&amp;view=findpost&amp;p=3800859</link>
        <description><![CDATA[Jin X: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">void test(const std::string&amp; str)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; str;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;test(&quot;Hello my dear friend!\n&quot;);</div><div class="code_line">}</div></ol></div></div></div></div><br>
Что происходит?<br>
Создаётся временный объект <strong class='tag-b'>const std::string</strong>, конструктор которого принимает (и копирует в себя) <strong class='tag-b'>const char*</strong>, вызывается функция <strong class='tag-b'>test</strong>, затем объект уничтожается. Много лишних действий.<br>
<br>
Можно ли сделать так, чтобы в EXE-шнике изначально хранился объект <strong class='tag-b'>std::string</strong>, а не создавался перед вызовом функции?<br>
<br>
p.s. В идеале – C++11, но если вариантов нет, рассмотрю что есть.<br>
<br>
p.p.s. Интересен также вариант без создания промежуточных констант, если такое возможно, потому что, понятное, дело, можно сделать <strong class='tag-b'>const std::string text = &quot;Hello my dear friend&#33;&#092;n&quot;;</strong> и подставлять её, но это неинтересно. Да и всё равно объект создаётся динамически.]]></description>
        <author>Jin X</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	