CPLUSPLUC Telegram 1081
🧠 Задача с подвохом для продвинутых C++ разработчиков

🔹 Уровень: Advanced
🔹 Темы: std::vector, управление памятью, конструкторы/деструкторы, reserve() vs resize()

📌 Условие

Рассмотрим следующий код:


#include <iostream>
#include <vector>

struct Foo {
Foo() { std::cout << "Ctor\n"; }
~Foo() { std::cout << "Dtor\n"; }
Foo(const Foo&) { std::cout << "Copy\n"; }
Foo(Foo&&) noexcept { std::cout << "Move\n"; }
};

int main() {
std::vector<Foo> v;
v.reserve(3); // Резервируем место под 3 элемента

std::cout << "--- Pushing ---\n";
for (int i = 0; i < 3; ++i) {
v.push_back(Foo());
}

std::cout << "--- Done ---\n";
}


Вопросы

1. Что будет выведено на экран?
2. Почему reserve() не предотвращает конструкторы копирования/перемещения?
3. Что изменится, если заменить reserve(3) на resize(3)?

🔍 Разбор

Ожидаемый вывод:

--- Pushing ---
Ctor
Move
Dtor
Ctor
Move
Dtor
Ctor
Move
Dtor
--- Done ---
Dtor
Dtor
Dtor


🔧 Почему так происходит

- Foo() создаёт временный объект.
- push_back() вызывает перемещающий конструктор Move.
- Временный объект уничтожается (вызывается `Dtor`).
- reserve(3) выделяет память, но не создаёт объектов.

🔄 Если заменить `reserve(3)` на `resize(3)`

- resize(3) создаст 3 объекта Foo через конструктор по умолчанию.
- push_back(Foo()) добавит четвёртый, возможно вызовет realocation.
- Это может привести к копированию или перемещению уже созданных элементов.

⚠️ Подвох

Многие ошибочно считают, что reserve(n) создаёт n объектов. Но это не такreserve() только выделяет память, не вызывая конструкторы. Именно поэтому внутри push_back всё равно происходит перемещение или копирование.

🧠 Вывод

- reserve() — экономия на реаллокациях, без создания объектов.
- resize() — создаёт n объектов, вызывает конструкторы.
- Не путай эти методы — от этого зависит и производительность, и семантика.


// Резервирует память, не создаёт объекты
v.reserve(10);

// Создаёт 10 объектов Foo
v.resize(10);


📌 Совет:
Если не хочешь лишнего перемещения, используй emplace_back():


v.emplace_back(); // Вызывает конструктор Foo напрямую внутри вектора



@cpluspluc



tgoop.com/cpluspluc/1081
Create:
Last Update:

🧠 Задача с подвохом для продвинутых C++ разработчиков

🔹 Уровень: Advanced
🔹 Темы: std::vector, управление памятью, конструкторы/деструкторы, reserve() vs resize()

📌 Условие

Рассмотрим следующий код:


#include <iostream>
#include <vector>

struct Foo {
Foo() { std::cout << "Ctor\n"; }
~Foo() { std::cout << "Dtor\n"; }
Foo(const Foo&) { std::cout << "Copy\n"; }
Foo(Foo&&) noexcept { std::cout << "Move\n"; }
};

int main() {
std::vector<Foo> v;
v.reserve(3); // Резервируем место под 3 элемента

std::cout << "--- Pushing ---\n";
for (int i = 0; i < 3; ++i) {
v.push_back(Foo());
}

std::cout << "--- Done ---\n";
}


Вопросы

1. Что будет выведено на экран?
2. Почему reserve() не предотвращает конструкторы копирования/перемещения?
3. Что изменится, если заменить reserve(3) на resize(3)?

🔍 Разбор

Ожидаемый вывод:

--- Pushing ---
Ctor
Move
Dtor
Ctor
Move
Dtor
Ctor
Move
Dtor
--- Done ---
Dtor
Dtor
Dtor


🔧 Почему так происходит

- Foo() создаёт временный объект.
- push_back() вызывает перемещающий конструктор Move.
- Временный объект уничтожается (вызывается `Dtor`).
- reserve(3) выделяет память, но не создаёт объектов.

🔄 Если заменить `reserve(3)` на `resize(3)`

- resize(3) создаст 3 объекта Foo через конструктор по умолчанию.
- push_back(Foo()) добавит четвёртый, возможно вызовет realocation.
- Это может привести к копированию или перемещению уже созданных элементов.

⚠️ Подвох

Многие ошибочно считают, что reserve(n) создаёт n объектов. Но это не такreserve() только выделяет память, не вызывая конструкторы. Именно поэтому внутри push_back всё равно происходит перемещение или копирование.

🧠 Вывод

- reserve() — экономия на реаллокациях, без создания объектов.
- resize() — создаёт n объектов, вызывает конструкторы.
- Не путай эти методы — от этого зависит и производительность, и семантика.


// Резервирует память, не создаёт объекты
v.reserve(10);

// Создаёт 10 объектов Foo
v.resize(10);


📌 Совет:
Если не хочешь лишнего перемещения, используй emplace_back():


v.emplace_back(); // Вызывает конструктор Foo напрямую внутри вектора



@cpluspluc

BY C++ Academy


Share with your friend now:
tgoop.com/cpluspluc/1081

View MORE
Open in Telegram


Telegram News

Date: |

The group’s featured image is of a Pepe frog yelling, often referred to as the “REEEEEEE” meme. Pepe the Frog was created back in 2005 by Matt Furie and has since become an internet symbol for meme culture and “degen” culture. "Doxxing content is forbidden on Telegram and our moderators routinely remove such content from around the world," said a spokesman for the messaging app, Remi Vaughn. Avoid compound hashtags that consist of several words. If you have a hashtag like #marketingnewsinusa, split it into smaller hashtags: “#marketing, #news, #usa. The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. Image: Telegram.
from us


Telegram C++ Academy
FROM American