spamsink: (Default)
[personal profile] spamsink


Кто не пишет на С++, догадайтесь, что печатает эта программа:
#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);
}


И при всем богатстве выбора языков другой альтернативы нет.

Улита едет, когда-то будет.

Date: 2010-03-06 11:51 am (UTC)
From: [identity profile] dvv.livejournal.com
Ничиво нипичатает — printf() не объявлена, и оно не компилится. Я, правда, пишу на C++.

Date: 2010-03-06 11:52 am (UTC)
From: [identity profile] dvv.livejournal.com
P.S.
vector < vector < foo > >? Really?

Date: 2010-03-06 02:10 pm (UTC)
ak_47: (Default)
From: [personal profile] ak_47
Я пишу на С++ и, видимо, мозг уже непоправимо искалечен. Ищу слово "лопата" и нигде не нахожу. Скажите где смеяться.

Date: 2010-03-06 05:28 pm (UTC)
ak_47: (Default)
From: [personal profile] ak_47
Мнэ... У меня не отличаются и в последней - все нули. VC++ 2008 SP1.

Date: 2010-03-06 05:53 pm (UTC)
From: [identity profile] 6zow.livejournal.com
Еще необходимо указать настройки оптимизатора и включена ли отладка :)

Date: 2010-03-06 06:21 pm (UTC)
From: [identity profile] dvv.livejournal.com
Ну дык complexity у vector херовая для постоянных insert, а тут ещё и целый вектор инсертим взад.

Ну и push_back() от значения из дефолтного конструктора — весьма сомнительное занятие…

Date: 2010-03-06 06:26 pm (UTC)
From: [identity profile] dvv.livejournal.com
Соответствует. Начальный capacity() вектора стандартом не определён.

Date: 2010-03-06 06:29 pm (UTC)
ak_47: (Default)
From: [personal profile] ak_47
И Дебаг и Релиз билды выдают одинаковый результат.

Date: 2010-03-06 06:42 pm (UTC)
ak_47: (Default)
From: [personal profile] ak_47
А почему не соответствует?

Я посмотрел в сорсы мелкомягкого вектора, там всё по-умному сделано через swap, поэтому дополнительного копирования не происходит на втором вызове pool.push_back. Я не знаю, на самом деле, насколько такое поведение стандартно.

Date: 2010-03-06 06:47 pm (UTC)
From: [identity profile] dvv.livejournal.com
По стандарту она совершенно конкретная, чего бы там компании ни хотели.

Для push_back() дефолтного значения существует resize(). Хоть на тыщу элементов за раз, хоть на сколько.

Date: 2010-03-06 06:49 pm (UTC)
From: [identity profile] dvv.livejournal.com
Какая часть выражения „стандартом не определён” тебя смущает?

Date: 2010-03-06 07:08 pm (UTC)
From: [identity profile] dvv.livejournal.com
Не надо делать никаких предположений про реализацию там, где стандарт этого не делает. И всё будет шоколадно.

Date: 2010-03-06 07:10 pm (UTC)
ak_47: (Default)
From: [personal profile] ak_47
Выдаёт 0. Дебаг и Релиз.

Date: 2010-03-06 07:20 pm (UTC)
From: [identity profile] dvv.livejournal.com
Потому что хочешь делать предположения, которые стандарт не делает.

Date: 2010-03-06 07:51 pm (UTC)
From: [identity profile] dvv.livejournal.com
Вот такой он тормозной дядька, стандарт этот. Увидишь его — смело высказывай ему в лицо своё фе.

Date: 2010-03-06 09:42 pm (UTC)
From: [identity profile] http://users.livejournal.com/_navi_/
это что, он старое содержимое копирует что ли?

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 8th, 2026 07:56 am
Powered by Dreamwidth Studios