Конструктор для контейнеров (прежде всего std::vector) для указания начального capacity

ilnur.khuziev
ilnur.khuziev

Имплиментация кажется очень простой, достаточно типа

struct container_init_capacity_holder {
     size_t val;
}

и одной специализации конструктора.

-4
рейтинг
9 комментариев
Клеванец  Игорь
Первый вопрос на рассмотрении предложения в комитете: чем плох метод reserve() ?
std::vector<int> v;
v.reserve(100);
Клеванец Игорь
ilnur.khuziev
Клеванец Игорь, во-первых, так краше. Не надо недооценивать психологический элемент: думаю половина случаев когда программист сознательно не сделал reserve - нет было желания делать в две строки.
+ микро-оптимизация на инициализации переменных вектор
+ возможность в ряде случаев избегать именования временных переменных без потери производительности
ilnur.khuziev
ilnur.khuziev
Клеванец Игорь, так выразительнее и в духе RAII - мы определяем начальное состояние объекта.
ilnur.khuziev
Клеванец  Игорь
ilnur.khuziev, стандартная библиотека вообще для людей с крепкими нервами. Но лень написать строку - это нечто странное...
Можно увидеть пример кода с временными переменными, который хочется оптимизнуть?
Клеванец Игорь
ilnur.khuziev
Клеванец Игорь, ну вот пример, кода нам нужно вместо внутреннего представления данных использовать стандартный - вектор.

void some_lib_function(const std::vector<int>&);

struct my_strange_container; //only have forward iterator

void proxy_call(const my_strange_container& src) {
some_lib_function(
std::vector(std::reserve(src.Size()).assing(src.begin(), src.end())
);
//assign никак не может вычислить будущий размер и переаллокаций не избежать без предварительного reserve
}
ilnur.khuziev
Клеванец  Игорь
ilnur.khuziev, в каждой точке вызова такую бороду кода писать - странно. По-хорошему надо написать где-то функцию, которая переложит данные из одного контейнера в другой и сделает это правильно - с использованием reserve()
Клеванец Игорь
ilnur.khuziev
Клеванец Игорь, с++ развивается в сторону увеличения выразительности. Так и лямбды то не нужны, и auto какая-то дичь. Мелкое изменение которое заставляет рутинную вещь выглядить лучше, а также избегать лишних

А так да, пример с прокси вызовом конечно очень не естественный. Но основной случай default constructor + reserve имхо очень жизненный.
ilnur.khuziev
yndx-antoshkka
Что тут написано?
std::vector<int> v(100, int{1}, container_init_capacity_holder{1024});
Немного непонятно, не правда ли?

А вот так лучше:
std::vector<int> v;
v.reserve(1024);
v.resize(100, int{1}); // тоже бяка, но лучше чем в первом примере


Но основное моё возражение: идее не хватает масштаба. Мне будет просто совестно отвлекать LEWG и LWG от Ranges/Networking/Coroutines/Span/constexpr/sse/Concurrency proposalом на добавление 1 конструктора в вектор, который ещё и не привносит нового функционала.
yndx-antoshkka
a.d.romanov
Проблема не в двух строках вместо одной. Проблема в том, что никто не гарантирует zero-overhead у пустого вектора.
a.d.romanov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).