32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
1 | |
Возможно ли это на с++?07.08.2011, 19:46. Показов 3839. Ответов 56
Метки нет (Все метки)
Допустим есть класс
Код
class MyBool{ int data; //Читаем бит номер num bool GetVal(num){return data&(1<<num);} //Записываем в бит номер num значение val void SetVal(num,val){val?data|=(1<<num):data&=~(1<<num);} }; А теперь вопрос: Существует ли способ определить операторы так, чтобы работал следующий код: Код
MyBool a; if(a[0]) a[1]=true;
0
|
07.08.2011, 19:46 | |
Ответы с готовыми решениями:
56
Как возможно изменить даты создания файлов на сервере? И Возможно ли это? Кто может это переработать для андроида? И вообще это возможно? Как это сделать , если это возможно, сам не уверен К сыну в реанимацию забежал врач и заявил: «Это мой сын!». Возможно ли это? |
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
07.08.2011, 21:30 [ТС] | 21 |
Главное - не красиво внутри, главное внутри эффективно, а снаружи красиво. Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.08.2011, 21:35 | 22 |
да ну? программы на алгоритмах и stl'вских контейнарах в большинстве случаев работают эффективнее написанных ручками
0
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
07.08.2011, 21:45 [ТС] | 23 |
В большинстве, но не всегда. Если кривыми ручками, то конечно.
Но тут я либо не понимаю принцип STL, либо не понимаю как они это хорошо реализовали - разве на получение reference и его использование не тратятся лишние ресурсы? Например если просто в описанном в первом посте классе задать массив интов, и делать выбор из них нужного - банальным делением - не будет ли так быстрее при доступе к большому количеству битов, хранящихся в интах? Ведь нам на каждом шаге не нужен reference - только деление - результат деления и остаток(в асме знаю, что остаток и результат сразу доступны после 1й команды) и две булевы операции. Или все таки reference быстрее будет работать? Ведь даже у него нет никаких способов указать на конкретный бит одной ссылкой. По сути с референсами надо перейти по ссылке и все равно выполнить те же операции, чтобы достать бит. Переходы быстрые, но зачем делать лишнее там, где планируется пускать по миллионам записей? Про вектор я говорил что не годится, т.к. в некоторых случаях лучше делать циклический один раз выделенный массив, чем вектор - намного шустрее работает. Но зависит от того, где и зачем.
0
|
07.08.2011, 21:52 | 24 | |||||
Сообщение было отмечено как решение
Решение
вот быдлокод:
4
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.08.2011, 22:05 | 25 |
Teravisor, насчет скорости bitset не знаю - мне кажется он скорее для удобства, но в том же std::vector<bool> реализован нужны вам функционал, но не реализованы удобства типа возврата reference и работы с ним
насчет того как может быть быстрее: 1) для разных типов контенеров ( с разным типом доступа ) представлены разные алгоритмы 2) для stl у компилятора большие возможности инлайнить алгоритмы и операции контейнеров Добавлено через 7 минут Kastaneda, неплохо! издержки, что не работает код вида mb[0]=mb[1]=true;
1
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
07.08.2011, 22:14 [ТС] | 26 |
Красиво, и потери небольшие. Я до такого не додумался бы)
Да, идея здравая, скорее всего так и сделаю. Придется покопаться в stl и посмотреть какие алгоритмы мне нужны. Буду теперь копаться и думать. Спасибо за ваше внимание и помощь в этой теме. Добавлено через 4 минуты А тут возникает как раз проблема - чтобы это предусмотреть придется еще потратить скорости, хотя для конкретно нашего случая это не надо. В этом и проблема STL
0
|
07.08.2011, 22:49 | 27 | |||||
Да, не подумал.
Можно operator= вот так сделать:
0
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
07.08.2011, 23:04 [ТС] | 28 |
То же самое можно сказать и про то, как вы перешли от моих SetVal и GetVal к операторам. Если чуть приглядеться, то можно увидеть что и конвеер некоторых процессоров может работать хуже, и присваивание лишнее... Может компилятор это и оптимизировать сможет, но не факт. А 10 раз по камню это уже гора.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
07.08.2011, 23:17 | 29 |
Вы не правы. Наши ребята-олимпиадники сравнивали производительность вектора и "самопального" динамического массива в разных задачах. Как правило, реализация с вектором оказывалась всегда хоть немного, но быстрее любых "самопальных" структур.
0
|
Jupiter
|
07.08.2011, 23:19
#30
|
Не по теме: а если еще сравнить исходники вектора в составе vs и gcc, так мелкософт это просто кучка непрофессионалов:D
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
07.08.2011, 23:27 | 31 | |||||
Сообщение было отмечено как решение
Решение
Мне кажется, что данная задача — это как раз тот случай, когда разумно воспользоваться прокси-объектами.
Ниже мои наброски. Несмотря на то, что исходный код раздулся, хороший оптимизирующий компилятор имеет широкий простор для деятельности и способен повыкидывать нафиг все прослойки.
4
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
07.08.2011, 23:30 [ТС] | 32 |
Ключевое слово здесь - динамического. Где вы видели в предложенном мной коде динамический массив? Плюс вектор массивов зачастую еще быстрее работает. Поэтому я вектор и отметаю сразу - каким бы гениальным он не был, он будет медленнее чем нединамический массив, если его можно конечно использовать.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.08.2011, 23:36 | 33 |
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
07.08.2011, 23:51 | 34 |
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.08.2011, 23:59 | 35 |
grizlik78, у вас фактически реализация как bitset c Accessor вместо reference
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
08.08.2011, 00:00 | 36 |
alex_x_x, ну общий принцип-то давно в книжках описан. Но я не подсматривал, честно
0
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
08.08.2011, 00:15 [ТС] | 37 |
А поддерживает ли побитовое хранение?
P.S. Не пробуйте сравнить по скорости эти варианты на студии. Я попробовал и долго смеялся как она компилит.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
08.08.2011, 12:22 | 39 |
Вы будете смеяться, но reference в bitset реализован на основе паттерна прокси...
Добавлено через 3 минуты Нединамический массив требует 1. константного выражения в качестве размера. 2. Должен быть глобальным, если его размер превосходит размер стека. Либо размер стека надо увеличивать. С динамическими массивами подобных проблем нет. А скорость доступа по указателю - одинакова.
0
|
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
|
|
08.08.2011, 14:15 [ТС] | 40 |
Или я вас не понял, или я этого не знал. Где почитать можно в надежных источниках, чтобы определиться? Если ссылка на стандарт, то пункт в нем, пожалуйста, а то он большой.
Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
0
|
08.08.2011, 14:15 | |
08.08.2011, 14:15 | |
Помогаю со студенческими работами здесь
40
Возможно ли это и если да как это сделать? Как это возможно? И возможно ли? Это возможно? БД на Java, возможно ли это? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |