Форум программистов, компьютерный форум CyberForum.ru

Инициализировать массив быстро? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:04     Инициализировать массив быстро? #1
Возможно ли инициализировать все элементы массива каким-то числом быстрее, чем через цикл? Как это можно сделать? Если нельзя, то как лучше это сделать в цикле-помещать локальные переменные счетчика и числа в процессорные регистры?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 20:10     Инициализировать массив быстро? #2
Цитата Сообщение от vb_lord Посмотреть сообщение
Если нельзя, то как лучше это сделать в цикле-помещать локальные переменные счетчика и числа в процессорные регистры?
вы не сможете этого сделать, что помещать в регистры, а что нет - решает компилятор
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 20:11     Инициализировать массив быстро? #3
а из каких элементов состоит массив? по сколько байт 1 элемент
и еще- разные ли значения у чисел или одним заполняется
и еще - не нулем ли?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.12.2011, 20:26     Инициализировать массив быстро? #4
memset сработает правильно только для нулевых значений
других компиляторо-независимых решений нет
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:30  [ТС]     Инициализировать массив быстро? #5
Цитата Сообщение от Jupiter Посмотреть сообщение
вы не сможете этого сделать, что помещать в регистры, а что нет - решает компилятор
В MSDN написано, что это решается спецификатором register при отключенной в настройках компилятора оптимизации.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.12.2011, 20:32     Инициализировать массив быстро? #6
Цитата Сообщение от vb_lord Посмотреть сообщение
В MSDN написано, что это решается спецификатором register при отключенной в настройках компилятора оптимизации
те отключить мощную оптимизацию компилятором и включить сомнительную
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:36  [ТС]     Инициализировать массив быстро? #7
Цитата Сообщение от DeadRipper Посмотреть сообщение
а из каких элементов состоит массив? по сколько байт 1 элемент
и еще- разные ли значения у чисел или одним заполняется
и еще - не нулем ли?
Массивы double и int типов. Инициализируются одним значением. Иногда это ноль.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 20:36     Инициализировать массив быстро? #8
vb_lord, http://www.cyberforum.ru/faq/thread1...ml#post1743092
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:37  [ТС]     Инициализировать массив быстро? #9
Цитата Сообщение от alex_x_x Посмотреть сообщение
memset сработает правильно только для нулевых значений
других компиляторо-независимых решений нет
Спасибо, иногда это подойдет, не знал про эту функцию.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.12.2011, 20:38     Инициализировать массив быстро? #10
Цитата Сообщение от Jupiter Посмотреть сообщение
вы не сможете этого сделать, что помещать в регистры, а что нет - решает компилятор
Во-первых этого нельзя несделать, так как только в регистрах возможна хоть какая то арифметика, включая инкрмент/декремент счётчиков, а во-вторых есть директива register, заставляющая компилятор генерить код, хранящий переменную в регистре максимально долго - register. Только если компилятор сам не собирался сгенерить именно такой код, то применение данной директивы приведёт к тормозам из-за того, что переменная, которую действительно необходимо постоянно хранить в регистре, вместо него окажется в оперативе.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 20:40     Инициализировать массив быстро? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
заставляющая компилятор генерить код
читай по ссылке выше
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:42  [ТС]     Инициализировать массив быстро? #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
те отключить мощную оптимизацию компилятором и включить сомнительную
Верно, но иногда это единственное решение, т.к. компилятор не может определить, что в некоторых функциях время расчетов растет експоненциально на каждой итерации(), и весь остальной неоптимизированный код по сравнению с этим - абсолютно неважен по скорости, а важна - единственная функция супер-емкая по времени.
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
10.12.2011, 20:43     Инициализировать массив быстро? #13
Цитата Сообщение от vb_lord Посмотреть сообщение
Массивы double и int типов. Инициализируются одним значением. Иногда это ноль.
тогда оптимизировать никак не удастся, я думал число статичное.

если пользуетесь Visual Studio то можно оптимизировать на языке ассемблер, вставкой _asm{
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:47  [ТС]     Инициализировать массив быстро? #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Во-первых этого нельзя несделать, так как только в регистрах возможна хоть какая то арифметика, включая инкрмент/декремент счётчиков, а во-вторых есть директива register, заставляющая компилятор генерить код, хранящий переменную в регистре максимально долго - register. Только если компилятор сам не собирался сгенерить именно такой код, то применение данной директивы приведёт к тормозам из-за того, что переменная, которую действительно необходимо постоянно хранить в регистре, вместо него окажется в оперативе.
В справочнике по С++ сказано, что в таком случае(занятости регистра) компилятор помещает переменные не в оперативку, а в кэш-память процессора, что, как я понимаю - существенно быстрее работает, чем оперативная память.

Добавлено через 1 минуту
Цитата Сообщение от DeadRipper Посмотреть сообщение
тогда оптимизировать никак не удастся, я думал число статичное.

если пользуетесь Visual Studio то можно оптимизировать на языке ассемблер, вставкой _asm{
Спасибо, к сожаленю, не владею ассемблером, изучать нет времени.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.12.2011, 20:55     Инициализировать массив быстро? #15
Если элемент влазит в полрегистра, то можно писать два элемента за раз.
C++
1
2
3
4
5
6
7
8
int a[100]; // Тип может быть любым, лишь бы его sizeof = 4 
hyper *p=a; //sizeof этого типа = 8
hyper c=...; //А сюда присвоить код значения, повторённый дважды. Например, если код значения 0xFEC4AB23, то присвоить надо 0xFEC4AB23FEC4AB23
int i;
for (i=49; i>=0; --i)//Обратите внимание на половинное число элементов
{
 p[i]=c;//А здесь инитим два элемента за раз.
}
надо только чтоб используемый подставной тип влез в регистр, иначе эффекта не будет. Если же элемент влазит в четверть регистра, то можно ещё ускорить:
C++
1
2
3
4
5
6
7
8
short int a[100]; // Тип может быть любым, лишь бы его sizeof = 2 
hyper *p=a; //sizeof этого типа = 8
hyper c=...; //А сюда присвоить код значения, повторённый 4 раза. Например, если код значения 0xFEC4, то присвоить надо 0xFEC4FEC4FEC4FEC4
int i;
for (i=24; i>=0; --i)//Обратите внимание на число элементов, уменьшенное в 4 раза.
{
 p[i]=c;//А здесь инитим 4 элемента за раз.
}
Если же элемент помещается 8 раз, то:
C++
1
2
3
4
5
6
7
8
char a[200]; // Тип может быть любым, лишь бы его sizeof = 1 
hyper *p=a; //sizeof этого типа = 8
hyper c=...; //А сюда присвоить код значения, повторённый 8 раз. Например, если код значения 0xFE, то присвоить надо 0xFEFEFEFEFEFEFEFE
int i;
for (i=24; i>=0; --i)//Обратите внимание на число элементов, уменьшенное в 8 раз.
{
 p[i]=c;//А здесь инитим 8 элементов за раз.
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.12.2011, 20:55     Инициализировать массив быстро? #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Во-первых этого нельзя несделать, так как только в регистрах возможна хоть какая то арифметика, включая инкрмент/декремент счётчиков, а во-вторых есть директива register, заставляющая компилятор генерить код, хранящий переменную в регистре максимально долго - register.
mmx/sse не, не слышали?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.12.2011, 20:56     Инициализировать массив быстро? #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
mmx/sse не, не слышали?
А когда это mmxовые регистры перестали называться тоже регистрами?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.12.2011, 20:58     Инициализировать массив быстро? #18
taras atavin, а как с ними стал связан register?
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
10.12.2011, 20:59  [ТС]     Инициализировать массив быстро? #19
Цитата Сообщение от DeadRipper Посмотреть сообщение
тогда оптимизировать никак не удастся, я думал число статичное.

если пользуетесь Visual Studio то можно оптимизировать на языке ассемблер, вставкой _asm{
А какой вариан может быть для статичного числа? Возможно, смогу привести к этому виду код некоторых функций.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 21:00     Инициализировать массив быстро?
Еще ссылки по теме:

не получается инициализировать массив C++
Как инициализировать массив в классе C++
Как инициализировать массив в dll ? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.12.2011, 21:00     Инициализировать массив быстро? #20
register - директива хранения переменной, обеспечивающая предельно быстрый доступ именно к ней. Если для этого полезен mmx, то дико сомневаюсь, что в таком случае компилятор не выберет именно такой регистр.
Yandex
Объявления
10.12.2011, 21:00     Инициализировать массив быстро?
Ответ Создать тему
Опции темы

Текущее время: 16:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru