Проклятие долины страусов
Mar. 6th, 2010 02:11 amКто не пишет на С++, догадайтесь, что печатает эта программа:
#include <vector>
using namespace std;
int ctors, dtors, copyctors;
struct foo {
foo() { ctors++; }
foo(const foo &) { copyctors++; }
~foo() { dtors++; }
};
vector < vector < foo > > pool;
void addline() {
ctors = dtors = copyctors = 0;
pool.push_back(vector < foo > ());
pool.back().reserve(1000);
for (int i = 0; i < 1000; ++i)
pool.back().push_back(foo());
printf("ctors = %d, dtors = %d, copyctors = %d\n",
ctors, dtors, copyctors);
}
main() {
addline();
addline();
ctors = dtors = copyctors = 0;
pool.push_back(vector < foo > ());
printf("ctors = %d, dtors = %d, copyctors = %d\n",
ctors, dtors, copyctors);
}И при всем богатстве выбора языков другой альтернативы нет.
Улита едет, когда-то будет.
no subject
Date: 2010-03-06 11:51 am (UTC)no subject
Date: 2010-03-06 05:13 pm (UTC)no subject
Date: 2010-03-06 11:52 am (UTC)vector < vector < foo > >? Really?
no subject
Date: 2010-03-06 05:14 pm (UTC)no subject
Date: 2010-03-06 06:21 pm (UTC)Ну и push_back() от значения из дефолтного конструктора — весьма сомнительное занятие…
no subject
Date: 2010-03-06 06:28 pm (UTC)Чем тебя push_back() от значения из дефолтного конструктора не устроил?
no subject
Date: 2010-03-06 06:47 pm (UTC)Для push_back() дефолтного значения существует resize(). Хоть на тыщу элементов за раз, хоть на сколько.
no subject
Date: 2010-03-06 07:08 pm (UTC)Где тыща элементов, там в реальной жизни не дефолт-конструкторы.
А что push_back(), что resize() при size() == capacity() - всё едино.
no subject
Date: 2010-03-06 02:10 pm (UTC)no subject
Date: 2010-03-06 05:16 pm (UTC)no subject
Date: 2010-03-06 05:28 pm (UTC)no subject
Date: 2010-03-06 05:53 pm (UTC)no subject
Date: 2010-03-06 06:29 pm (UTC)no subject
Date: 2010-03-06 06:49 pm (UTC)Что в новом VC++ выдает эта программа:
#include <vector>
#include <iostream>
main() {
std::cout << std::vector< std::vector< int> >().capacity();
}
no subject
Date: 2010-03-06 07:10 pm (UTC)no subject
Date: 2010-03-06 05:53 pm (UTC)no subject
Date: 2010-03-06 06:26 pm (UTC)no subject
Date: 2010-03-06 06:40 pm (UTC)no subject
Date: 2010-03-06 06:49 pm (UTC)no subject
Date: 2010-03-06 06:56 pm (UTC)Языку хрен знает сколько лет, а реализации все - кто в лес, кто по дрова. Хуже Верилога какого-нибудь, прости господи. Хардверщикам, разрабатывающим язык, еще простительно, но тут-то...
no subject
Date: 2010-03-06 07:08 pm (UTC)no subject
Date: 2010-03-06 07:13 pm (UTC)no subject
Date: 2010-03-06 07:20 pm (UTC)no subject
Date: 2010-03-06 07:27 pm (UTC)no subject
Date: 2010-03-06 07:51 pm (UTC)no subject
Date: 2010-03-06 06:42 pm (UTC)Я посмотрел в сорсы мелкомягкого вектора, там всё по-умному сделано через swap, поэтому дополнительного копирования не происходит на втором вызове pool.push_back. Я не знаю, на самом деле, насколько такое поведение стандартно.
no subject
Date: 2010-03-06 06:57 pm (UTC)no subject
Date: 2010-03-06 09:42 pm (UTC)no subject
Date: 2010-03-06 10:18 pm (UTC)