<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль virtual_void]]></title>
    <link>https://habr.com/ru/users/virtual_void/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя virtual_void]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 30 Apr 2026 09:45:10 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>08.11.2025 15:17:55 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/963938/#comment_29082108</guid>
      <link>https://habr.com/ru/articles/963938/#comment_29082108</link>
      <description><![CDATA[<blockquote><ul><li><p><code>push_back</code>&nbsp;создает объект, затем перемещает/копирует его в вектор</p></li><li><p><code>emplace_back</code>&nbsp;создает объект&nbsp;<strong>прямо в векторе</strong>&nbsp;(без копирования/перемещения)</p></li></ul></blockquote><p>push_back сам по себе ничего не создает. Пример из статьи корректен, но лишний вызов конструктора происходит на стороне, вызывающей push_back.</p><blockquote><p><code>std::vector&lt;Point&gt; v;</code><br><code>v.reserve(10);  </code><br><code>// чтобы избежать реаллокаций</code><br><code>// push_back: конструктор + move</code><br><code>v.push_back(Point(1, 2));</code><br><code>// Вывод:</code><br><code>// Constructor</code><br><code>// Move constructor</code><br><code>// emplace_back: только конструктор</code><br><code>v.emplace_back(3, 4);</code><br><code>// Вывод:</code><br><code>// Constructor</code></p></blockquote><p>Для уже существующих объектов разницы не будет</p><pre><code>std::vector&lt;Something&gt; v;
Something v1, v2;
v.push_back(v1); // copy
v.push_back(std::move(v1)); // move
v.emplace_back(v2); // copy
v.emplace_back(std::move(v2)); // move</code></pre><p>-------------------------------</p><blockquote><p><strong>Что возвращают</strong>:</p><ul><li><p><code>push_back</code>:&nbsp;<code>void</code>&nbsp;(до C++17),&nbsp;<code>reference</code>&nbsp;(C++17+)</p></li><li><p><code>emplace_back</code>:&nbsp;<code>void</code>&nbsp;(до C++17),&nbsp;<code>reference</code>&nbsp;(C++17+)</p></li></ul></blockquote><p>push_back не возвращает reference.</p><blockquote><p>reserve(): предварительное выделение памяти</p><p><strong>Когда НЕ использовать</strong>:  </p><ul><li><p>❌ Работаете с огромными объектами и хотите экономить память</p></li></ul></blockquote><p>Не очень ясно, как неиспользование reserve поможет экономить память, учитывая экспоненциальную стратегию роста при использовании push_back/emplace_back.</p><p>-------------------------------</p><blockquote><p>1. Избегайте ненужных копирований</p></blockquote><pre><code>// ❌ Плохо: копирование при каждой вставке
std::vector&lt;std::string&gt; v;
for (const auto&amp; s : data) {
    v.push_back(s);  // копирование
}

// ✅ Хорошо: перемещение
std::vector&lt;std::string&gt; v;
for (auto&amp;&amp; s : data) {
    v.push_back(std::move(s));  // перемещение
}

// ✅ Еще лучше: emplace_back (если подходит)
std::vector&lt;std::string&gt; v;
for (const auto&amp; s : data) {
    v.emplace_back(s);
}</code></pre><p>Тут на самом деле нет разницы между первым и последним примером - и там и там копирование всего вектора.</p>]]></description>
      <pubDate>Sat, 08 Nov 2025 15:17:55 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>08.11.2025 09:28:28 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/963938/#comment_29080790</guid>
      <link>https://habr.com/ru/articles/963938/#comment_29080790</link>
      <description><![CDATA[<p>Рекомендую автору перестать копировать ответы из llm и проверять статьи перед публикацией на предмет корректности содержимого.</p>]]></description>
      <pubDate>Sat, 08 Nov 2025 09:28:28 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>08.11.2025 09:02:10 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/963938/#comment_29080680</guid>
      <link>https://habr.com/ru/articles/963938/#comment_29080680</link>
      <description><![CDATA[<blockquote><p>Гарантии безопасности исключений</p><p><code>std::vector</code>&nbsp;предоставляет&nbsp;<strong>строгую гарантию</strong>&nbsp;(strong exception guarantee) для большинства операций:</p><ul><li><p>Если операция бросает исключение, вектор остается в исходном состоянии</p></li><li><p><strong>НО</strong>: только если конструктор перемещения&nbsp;<code>T</code>&nbsp;помечен&nbsp;<code>noexcept</code>!</p></li></ul></blockquote><p>Ну это уже совсем бред. Буквально несколько абзацев назад было написано, что вектор при реаллокации может копировать или перемещать элементы в зависимости от noexcept'ности конструктора перемещения хранимого типа. Спойлер - это сделано именно для того чтобы обеспечить strong exception safety guarantee для типов, у которых move-constructor не noexcept. (Там есть несколько нюансов про типы, которые не CopyInsertable, но это совсем частные случаи. Кстати, было бы круто, если бы эти нюансы упомянули в статье под названием "std::vector: от основ до тонкостей реализации").</p><p>Соответственно, в приведенном примере вообще не будет вызываться перемещающий конструктор. так что с вектором все будет нормально.</p><pre><code>struct ThrowingType {
    ThrowingType() = default;
    ThrowingType(const ThrowingType&amp;) = default;
    
    // ❌ Может бросить исключение
    ThrowingType(ThrowingType&amp;&amp;) {
        throw std::runtime_error("Move failed!");
    }
};

std::vector&lt;ThrowingType&gt; v(10);
try {
    v.reserve(20);  // может привести к неконсистентному состоянию!
} catch (...) {
    // v может быть поврежден
}</code></pre>]]></description>
      <pubDate>Sat, 08 Nov 2025 09:02:10 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
