как сделать это? в спеце с++ говориться, что можно задать инициализирующие значание ( вызвать конструктор ) при p = new int(10), но не при int *p = new int [10] (10) — вот это нельзя, приходиться делать for( int i=0; i<10; i++) p[i] = 10; но вот это долго... может есть какой-нить способ задать значение массиву более быстро ( может через асм или еще как )... и еще, у меня есть функция, которая вызывается очень часто, она оперирует с маленькими числами ( short int ) — что быстрее, передавать параметры ( 4 параметра ) в ввиде ссылки, указателя или копированием? просто потом эти значения ( 4 ) сравниваются... и еще один маленький вопрос: на разыменовывание тратиться такты процессора или нет? а при использовании ссылки происходят какие либо дополнительные действия процессора?
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
... и еще, у меня есть функция, которая вызывается очень часто, она оперирует с маленькими числами ( short int ) — что быстрее, передавать параметры ( 4 параметра ) в ввиде ссылки, указателя или копированием? просто потом эти значения ( 4 ) сравниваются...
если значения етих параметров не должны изменяться внутри функции :
конечно быстрее буде передать ссылку или указатель
с спецификатором const для безопасности
Здравствуйте promko, Вы писали:
P>если значения етих параметров не должны изменяться внутри функции : P>конечно быстрее буде передать ссылку или указатель P>с спецификатором const для безопасности
Это для параметров short int? Это с чего бы? Размер тот же (на 32-битных платформах), только обращение к памяти косвенное будет. Значит при использовании ссылок скорость в лучшем случае почти не изменится.
В то же время большие параметры (какие-нибудь крупные структуры), конечно, лучше передавать по ссылке, а уж объекты классов — тем более (иначе будет вызываться конструктор копирования).
А какая разница... short int и так передается в функцию 32-х битными значениями — либо в стеке, либо через регистры.
P>>если значения етих параметров не должны изменяться внутри функции : P>>конечно быстрее буде передать ссылку или указатель P>>с спецификатором const для безопасности
A>Это для параметров short int? Это с чего бы? Размер тот же (на 32-битных платформах), только обращение к памяти косвенное будет. Значит при использовании ссылок скорость в лучшем случае почти не изменится. A>В то же время большие параметры (какие-нибудь крупные структуры), конечно, лучше передавать по ссылке, а уж объекты классов — тем более (иначе будет вызываться конструктор копирования).
Здравствуйте Andrew S, Вы писали:
AS>А какая разница... short int и так передается в функцию 32-х битными значениями — либо в стеке, либо через регистры.
Вообще-то это от реализации компиллятора зависит и от настроек оптимизации. Если оптимизация не сработала, то при передаче short int по ссылке в стек кладется адрес переменной (обычно тоже 32-битный) и дальше идет косвенное обращение к параметру через адрес. Вполне возможно, что оно в теле функции кладется в регистр (если компиллятору регистров хватает).
Это да, но кто ж в здравом уме short int по ссылке передавать будет? Если только массив, да и тот через указатель — просто так как бы только паскаль позволяет...
AS>>А какая разница... short int и так передается в функцию 32-х битными значениями — либо в стеке, либо через регистры.
A>Вообще-то это от реализации компиллятора зависит и от настроек оптимизации. Если оптимизация не сработала, то при передаче short int по ссылке в стек кладется адрес переменной (обычно тоже 32-битный) и дальше идет косвенное обращение к параметру через адрес. Вполне возможно, что оно в теле функции кладется в регистр (если компиллятору регистров хватает).
Здравствуйте Shhady, Вы писали:
S>как сделать это? в спеце с++ говориться, что можно задать инициализирующие значание ( вызвать конструктор ) при p = new int(10), но не при int *p = new int [10] (10) — вот это нельзя, приходиться делать for( int i=0; i<10; i++) p[i] = 10; но вот это долго... может есть какой-нить способ задать значение массиву более быстро ( может через асм или еще как )...
const int nSize = ...;
int* p = new int[nSize];
std::fill(p, p + nSize, 10);
и еще, у меня есть функция, которая вызывается очень часто, она оперирует с маленькими числами ( short int ) — что быстрее, передавать параметры ( 4 параметра ) в ввиде ссылки, указателя или копированием? просто потом эти значения ( 4 ) сравниваются...
А что мешает сделать эту функцию inline?
Здравствуйте Bell, Вы писали:
B>Здравствуйте Shhady, Вы писали:
S>>как сделать это? в спеце с++ говориться, что можно задать инициализирующие значание ( вызвать конструктор ) при p = new int(10), но не при int *p = new int [10] (10) — вот это нельзя, приходиться делать for( int i=0; i<10; i++) p[i] = 10; но вот это долго... может есть какой-нить способ задать значение массиву более быстро ( может через асм или еще как )...
B>
B>const int nSize = ...;
B>int* p = new int[nSize];
B>std::fill(p, p + nSize, 10);
B>
Так проще использовать сразу strd::vector с соответствующим конструктором:
std::vector<int> v(nSize, 10);
B>и еще, у меня есть функция, которая вызывается очень часто, она оперирует с маленькими числами ( short int ) — что быстрее, передавать параметры ( 4 параметра ) в ввиде ссылки, указателя или копированием? просто потом эти значения ( 4 ) сравниваются... B>А что мешает сделать эту функцию inline?
думаю, для любого нормального компилятора/оптимизатора вообще никакой разницы не будет между ссылками, передачей по значению и объявлением inline: наверняка он сам все проинлайнит автоматически, если функция действительно так проста.
Здравствуйте Shhady, Вы писали:
S>как сделать это? в спеце с++ говориться, что можно задать инициализирующие значание ( вызвать конструктор ) при p = new int(10), но не при int *p = new int [10] (10) — вот это нельзя, приходиться делать for( int i=0; i<10; i++) p[i] = 10; но вот это долго... может есть какой-нить способ задать значение массиву более быстро ( может через асм или еще как )... и еще, у меня есть
На самом деле циклом тут получится очень быстро. Если хочешь поизвращаться, то можно еще цикл поразворачивать, но в данном случае, ИМХО, это лишнее.
>функция, которая вызывается очень часто, она оперирует с маленькими числами ( short int ) — что быстрее, передавать параметры ( 4 параметра ) в ввиде ссылки, указателя или копированием? просто
потом эти значения ( 4 ) сравниваются... и еще один маленький вопрос: на разыменовывание тратиться такты процессора или нет? а при использовании ссылки происходят какие либо дополнительные действия процессора?
Не ссылкой и не указателем. Как уже сказали, это может добавить лишнюю разадресацию.
Для твоего конкретного варианта могу предложить запихать твои параметры в один int64 и передавать его. И передаваться будет быстро и сравнение (если оно на равенство) в одну операцию.
Здравствуйте jazzer, Вы писали:
J>думаю, для любого нормального компилятора/оптимизатора вообще никакой разницы не будет между ссылками, передачей по значению и объявлением inline: наверняка он сам все проинлайнит автоматически, если функция действительно так проста.
Ну во-первых, нормальных компилляторов не существует Все они как правило "глупее", чем средний программер на ASM-е. (это, конечно, не значит, что все должны броситься писать не assembler'е)
Во вторых, каким бы ни был "умным" компиллятор, функция должна поддерживать определенный договор о правилах вызова. Если сказано, что параметр передается по ссылке, то он передается по ссылке, иначе линкер просто не поймет прикола
Здравствуйте Lexey, Вы писали:
L>На самом деле циклом тут получится очень быстро. Если хочешь поизвращаться, то можно еще цикл поразворачивать, но в данном случае, ИМХО, это лишнее.
Практически все современные компилляторы сами разворачивают цикл и если это делать самому вручную, то скорее всего Вы только запутаете оптимизатор и получится только медленнее.
Кстати, мне один знакомый из Intel сказал, что раскрутка циклов на P4 практически ничего не дает.
Здравствуйте Atilla, Вы писали:
A>Ну во-первых, нормальных компилляторов не существует
Не согласен.
Если бы их не было, использование "продвинутых" библиотек линейной алгебры (blitz++, pooma) просто не имело бы смысла — они как раз и рассчитывают на то, что компилятор все, что можно, встроит, сделает соответствующие оптимизации (начиная с copy propagation) и полностью уберет abstraction penalty (а точнее то, которое можно убрать во время компиляции). Если бы компиляторы так не делали, создание подобных библиотек было бы бессмысленно. Авторы библиотек констатируют, что VC не выполняет все необходимые оптимизации. А вот при использовании KAI C++ (нормальный компилятор!!!) получается результат не уступающий библиотекам Fortran'a.
A>Все они как правило "глупее", чем средний программер на ASM-е. (это, конечно, не значит, что все должны броситься писать не assembler'е)
Все уже давным-давно согласились, что ассемблер — вынужденная мера. Используется только для агресивной оптимизации небольших по объему локализованных участков кода. На достаточно больших участках кода компилятор выигрывает в оптимизации у человека, пишущего на асме, — это мнение нашего зав. кафедрой, который 30 лет уже пишет оптимизирующие компиляторы.
Здравствуйте Anton V. Kolotaev, Вы писали:
AVK>Не согласен. AVK> А вот при использовании KAI C++ (нормальный компилятор!!!) получается результат не уступающий библиотекам Fortran'a.
Здравствуйте Atilla, Вы писали:
AVK>> А вот при использовании KAI C++ (нормальный компилятор!!!) получается результат не уступающий библиотекам Fortran'a.
A>А его где-нибудь можно скачать, поиграться?
Не знаю. Сейчас KAI куплен интелом — можешь посмотреть на их сайте.
Про то, что он — "нормальный", я вычитал здесь.