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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
vb_lord
2 / 2 / 0
Регистрация: 06.12.2011
Сообщений: 33
#1

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

10.12.2011, 20:04. Просмотров 3554. Ответов 39
Метки нет (Все метки)

Возможно ли инициализировать все элементы массива каким-то числом быстрее, чем через цикл? Как это можно сделать? Если нельзя, то как лучше это сделать в цикле-помещать локальные переменные счетчика и числа в процессорные регистры?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 20:04     Инициализировать массив быстро?
Посмотрите здесь:

Инициализировать массив - C++
Довольно примитивный вопрос. Помогите инициализировать двумерный массив Aтаблицей 01011 10000 01000 11000 00000 11000 ...

не получается инициализировать массив - C++
Вод есть код: #include<iostream> int main() { using namespace std; string zero = {"1+2","3+4"}; string one = {"5+6","7+8"}; ...

Как инициализировать массив в классе - C++
private: static char const figury_={0,4,0,0, 0,1,0,3, 2,1,0,3, 0,2,0,2, 1,2,0,2, ...

Как инициализировать массив ссылок? - C++
//--------------------------------------------------------------------------- #include <stdio.h> #include <conio.h> #pragma hdrstop ...

Как инициализировать массив переменной - C++
Всем доброго времени суток! у меня возникла проблема, мне нужно инициализировать статический массив с помощью переменной, т.е. пользователь...

Можно ли как-то инициализировать массив? - C++
Можно ли как-то инициализировать массив ar? class digit { int a, b; public: digit (int a_, int b_) { a=a_; b=b_; }

Как инициализировать массив чисел в С++? - C++
Помогите пожалуйста, проблема следующая: в классе Eleve нужно инициализировать массив чисел (оценки) так, чтобы при создании класса он...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
Каратель
Эксперт С++
6553 / 3973 / 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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.12.2011, 20:38     Инициализировать массив быстро? #10
Цитата Сообщение от Jupiter Посмотреть сообщение
вы не сможете этого сделать, что помещать в регистры, а что нет - решает компилятор
Во-первых этого нельзя несделать, так как только в регистрах возможна хоть какая то арифметика, включая инкрмент/декремент счётчиков, а во-вторых есть директива register, заставляющая компилятор генерить код, хранящий переменную в регистре максимально долго - register. Только если компилятор сам не собирался сгенерить именно такой код, то применение данной директивы приведёт к тормозам из-за того, что переменная, которую действительно необходимо постоянно хранить в регистре, вместо него окажется в оперативе.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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{
Спасибо, к сожаленю, не владею ассемблером, изучать нет времени.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 20:55     Инициализировать массив быстро?
Еще ссылки по теме:

Как инициализировать двумерный массив? - C++
подскажите как инициализировать двумерный массив long long int mass;

Как инициализировать такой массив - C++
Нужно в проге(консольное приложение Win32) испоьзовать массив таких размеров double massiv_resultatov={0}; просто так я не смог его...

Как инициализировать массив в dll ? - C++
Экспериментирую с dll. Сделал графическую функцию, которая рассчитывает расстояние между точками в цикле. Хочу оптимизировать ее, чтоб...

Как инициализировать массив строк? - C++
Здравствуйте, подскажите как инициализировать массив строк, кол-во строк неизвестно, они будут загружаться из текстового файла. И как...

Как инициализировать массив строк в конструкторе - C++
File.h class CTest { public: char* m_pszText; CTest( )


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

Или воспользуйтесь поиском по форуму:
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 элементов за раз.
}
Yandex
Объявления
10.12.2011, 20:55     Инициализировать массив быстро?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru