Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

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

если пользуетесь Visual Studio то можно оптимизировать на языке ассемблер, вставкой _asm{
Спасибо, к сожаленю, не владею ассемблером, изучать нет времени.
0
taras atavin
3570 / 1753 / 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 элементов за раз.
}
1
10.12.2011, 20:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 20:55
Привет! Вот еще темы с ответами:

Как инициализировать массив в классе - 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 ...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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