Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 09:30
Оценка:
Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?
Re: Увеличить размер of a vector без инициализации
От: ZegSoft Россия  
Дата: 19.02.11 09:45
Оценка:
Здравствуйте, igna, Вы писали:

I>Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?


А замем вам такая возможность? Заботитесь о производительности?
Re: Увеличить размер of a vector без инициализации
От: ononim  
Дата: 19.02.11 09:56
Оценка:
I>Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?
если мои догадки верны, то вам наверно нужен reserve
Как много веселых ребят, и все делают велосипед...
Re[2]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:11
Оценка:
Здравствуйте, ZegSoft, Вы писали:

ZS>А замем вам такая возможность? Заботитесь о производительности?


Да.
Re[3]: Увеличить размер of a vector без инициализации
От: LaptevVV Россия  
Дата: 19.02.11 10:18
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, ZegSoft, Вы писали:


ZS>>А замем вам такая возможность? Заботитесь о производительности?


I>Да.

Это имеет смысл если у вас циклы по нескольку миллиардов раз с векторами по нескольку миллионов элементов.
Например, у меня матрица размером 10000*10000 = 100 000 000 элементов. Цикл выполняется несколько тысяч миллиардов раз (триллионы, что ли? ) — тут эффективность критична. Ибо, если не принимать мер, считает сутками.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:19
Оценка:
Здравствуйте, ononim, Вы писали:

O>если мои догадки верны, то вам наверно нужен reserve


Нет, потому-что заполнять этот vector будет C функция, которой будут переданы &my_vector.front() и my_vector.size(). Если вместо последнего передать my_vector.capacity() и вызвать my_vector.resize() после вызова C функции, будет еще хуже, значения попросту перезапишутся нулями.
Re[4]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:20
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Это имеет смысл если у вас циклы по нескольку миллиардов раз с векторами по нескольку миллионов элементов.


Вот-вот, именно тот случай.
Re[3]: Увеличить размер of a vector без инициализации
От: night beast СССР  
Дата: 19.02.11 10:23
Оценка:
Здравствуйте, igna, Вы писали:

O>>если мои догадки верны, то вам наверно нужен reserve


I>Нет, потому-что заполнять этот vector будет C функция, которой будут переданы &my_vector.front() и my_vector.size(). Если вместо последнего передать my_vector.capacity() и вызвать my_vector.resize() после вызова C функции, будет еще хуже, значения попросту перезапишутся нулями.


а свой лисапед нельзя сделать?
Re[4]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:32
Оценка:
Здравствуйте, night beast, Вы писали:

NB>а свой лисапед нельзя сделать?


Можно, но вероятно я все же использую scoped/shared_array, несмотря на то, что размер придется передавать отдельно.
Re: Увеличить размер of a vector без инициализации
От: phprus  
Дата: 19.02.11 10:35
Оценка:
Здравствуйте, igna, Вы писали:

I>Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?


Штатными средствами этого сделать нельзя. Я недавно сталкивался с подобной задачей и оказалось, что во всех необходимых мне компиляторах (GCC, MSVS) в реализациях STL указатели на внутренние данные std::vector находятся в секции protected, что позволило унаследоваться от std::vector и реализовать недостающий функционал в виде нового метода, тело которого индивидуально для каждого компилятора. Минус такого решения в том, что у вектора не виртуальный деструктор и по этому нужно следить за недопустимостью полиморфного удаления нового контейнера.
Re[5]: Увеличить размер of a vector без инициализации
От: LaptevVV Россия  
Дата: 19.02.11 10:43
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, LaptevVV, Вы писали:


LVV>>Это имеет смысл если у вас циклы по нескольку миллиардов раз с векторами по нескольку миллионов элементов.


I>Вот-вот, именно тот случай.

У меня подобная решетка обнуляется за 1.5-2 секунды: v.assign(L*L, 0); При L = 10000
Ноут АСУС, процессор двухядерный, памяти 2 гига.
По моим наблюдениям при L = 16000 все еще хорошо работает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Увеличить размер of a vector без инициализации
От: любой  
Дата: 19.02.11 10:45
Оценка: 9 (1)
Здравствуйте, igna, Вы писали:

I>Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?


Если очень нужно, можно вместо char использовать специальный класс с ничего не делающим конструктором без параметров и конструкторами/операторами преобразований к/из char.
художников никогда не обижал
Re[2]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:46
Оценка:
Здравствуйте, phprus, Вы писали:

P>Штатными средствами этого сделать нельзя. Я недавно сталкивался с подобной задачей и оказалось, что во всех необходимых мне компиляторах (GCC, MSVS) в реализациях STL указатели на внутренние данные std::vector находятся в секции protected, что позволило унаследоваться от std::vector и реализовать недостающий функционал в виде нового метода, тело которого индивидуально для каждого компилятора. Минус такого решения в том, что у вектора не виртуальный деструктор и по этому нужно следить за недопустимостью полиморфного удаления нового контейнера.


Если бы это был единственный или хотя бы главный минус! Твое решение привязано к конкретной версии библиотеки, тебе ведь два раза пришлось его писать, для GCC и для VC? И между прочим protected или нет, приципиальной роли не играет, с тем же успехом ты мог бы и private обойти; суть-то ведь одна: ты положился на внутренности реализации.
Re[2]: Увеличить размер of a vector без инициализации
От: igna Россия  
Дата: 19.02.11 10:50
Оценка:
Здравствуйте, любой, Вы писали:

Л>Если очень нужно, можно вместо char использовать специальный класс с ничего не делающим конструктором без параметров и конструкторами/операторами преобразований к/из char.


Хм, спасибо, интересное решение. Вряд ли я буду делать так, но действительно интересно.
Re[6]: Преждевременная оптимизация
От: igna Россия  
Дата: 19.02.11 10:58
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>У меня подобная решетка обнуляется за 1.5-2 секунды: v.assign(L*L, 0); При L = 10000

LVV>Ноут АСУС, процессор двухядерный, памяти 2 гига.
LVV>По моим наблюдениям при L = 16000 все еще хорошо работает.

Так, то есть все же меняем тему. Хорошо, у меня свое мнение по поводу преждевременной оптимизации. Я вот недавно внес одно (добавляющее функциональность) изменение в программу замедлившее ее на 1%. Вроде оно и ладно, оставил пока так, хотя там точно есть возможность для оптимизации и надо будет к этому вернуться и хотя бы померять. Если окажется, что за счет оптимизации замедление программы (с добавленной функциональностью) будет не на 1%, а на 0,5%, то стоит ли этой отимизацией заниматься?
Re[7]: Преждевременная оптимизация
От: LaptevVV Россия  
Дата: 19.02.11 11:01
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, LaptevVV, Вы писали:


LVV>>У меня подобная решетка обнуляется за 1.5-2 секунды: v.assign(L*L, 0); При L = 10000

LVV>>Ноут АСУС, процессор двухядерный, памяти 2 гига.
LVV>>По моим наблюдениям при L = 16000 все еще хорошо работает.

I>Так, то есть все же меняем тему. Хорошо, у меня свое мнение по поводу преждевременной оптимизации. Я вот недавно внес одно (добавляющее функциональность) изменение в программу замедлившее ее на 1%. Вроде оно и ладно, оставил пока так, хотя там точно есть возможность для оптимизации и надо будет к этому вернуться и хотя бы померять. Если окажется, что за счет оптимизации замедление программы (с добавленной функциональностью) будет не на 1%, а на 0,5%, то стоит ли этой отимизацией заниматься?

Однозначно — не стОит...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Увеличить размер of a vector без инициализации
От: -MyXa- Россия  
Дата: 19.02.11 11:04
Оценка: 9 (1) :)
Здравствуйте, igna, Вы писали:

I>Похоже, что увеличить размер объекта типа std::vector<char> без инициализации его новых элементов нулем нельзя. Это так или есть все же такая возможность?


Пока писАл, тут уже ответили.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[5]: Увеличить размер of a vector без инициализации
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 19.02.11 11:05
Оценка:
Здравствуйте, igna, Вы писали:

I>Вот-вот, именно тот случай.


Я в вычислительных задачах забил на std::vector и использую std::valarray. С индексами работает гораздо быстрей, чем вектор, что с индексами, что с итераторами.
Re[8]: Преждевременная оптимизация
От: igna Россия  
Дата: 19.02.11 11:06
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Однозначно — не стОит...


Так ли уж однозначно? А если программа состоит из равных по времени выполнения ста частей, ускорив любую из них в два раза получаем выгоду в полпроцента, а ускорив все сто — в два раза, тоже не стоит?
Re[9]: Преждевременная оптимизация
От: LaptevVV Россия  
Дата: 19.02.11 11:09
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, LaptevVV, Вы писали:


LVV>>Однозначно — не стОит...


I>Так ли уж однозначно? А если программа состоит из равных по времени выполнения ста частей, ускорив любую из них в два раза получаем выгоду в полпроцента, а ускорив все сто — в два раза, тоже не стоит?

В два раза — стОит. А полпроцента — нет.
Тут же еще вопрос: сколько вашего времени это займет. Если день-два-неделю, то вполне может быть. А если lzk оптимизации надо перекпроектировать структуры данных, то надо просто начинать другой проект.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.