Дело в том, что компиляция программы — действие единичное, а вот запуск — регулярное.
Подправьте немного код, чтобы можно было вводить элементы массива и условия поиска, и запустите поиск миллиард раз, в сумме времени компиляции и времени работы, время компиляции уже будет ничтожно мало.
#offtop
Подобным образом люди ошибаются регулярно.
Мне часто приходится наблюдать такое, когда я говорю знакомым, что использую gentoo в качестве основной системы. Я не отрицаю, что сборка с нуля системы и всего софта, что я использую (ну не совсем с нуля, а со stage3) на моем ноуте занимает чуть больше суток, однако я получаю очень быструю и стабильную систему. Можно пытаться возражать, что оптимизация под машину не дает прибавки скорости, но пока не попробуешь сравнить, не увидишь реальное положение дел. Я пробовал использовать дистрибутивы, использующие бинарные пакеты, субъективно, скорость работы сильно различается, я склонен думать, что это связано с тем, что я один раз потратил время на то чтобы подобрать длинную строку флагов компилятора и дождался окончания сборки.
По стандарту не задается размер int, есть только рекомендация делать его равным машинному слову. на 64 битах машинное слово будет равно 64 битам, и размер int, скорее всего будет зависеть от настроек компилятора. Компиляторов много разных, поэтому с каким нибудь может получиться, что int имеет размер 64 бита. Попробовал добиться этого от GCC, но там для x86 и x86_64 размер int всегда равен 32 битам.
Думаю, Дворак. Так как разрабатывался без оглядки на остальные клавиатуры, но с опорой на эргономику.
К слову мировой рекорд скорости (150 слов в минуту на протяжении 50 минут) был установлен именно с помощью раскладки Дворака. (точнее упрощенной раскладки Дворака), собственно та же женщина достигала 170 слов в минуту на короткие промежутки времени и выдала рекордные 216 слов в минуту.
Кстати, с массивами в C++ не все так просто. С одной стороны, это просто последовательно расположенные в памяти данные, как это было в C, с другой, если точно известен размер массива в данном контексте, то доступны итераторы по этому массиву (по крайней мере в C++11).
void f(int [] array, size_t size);
/* ... */
int array[5];
/* тут доступны begin() и end() */
for (int a : array) {
std::cout << array << std::endl;
}
f(array, 5);
/* ... */
void f(int [] array, size_t size) {
/* а тут уже нет */
for (int i = 0; i < size; ++i) {
std::cout << array[i] << std::endl;
}
}
На самом деле, после C++ во многих языках не хватает переопределения операторов — может пригодиться как в простых случаях вроде операций с матрицами, так и вот в подобной магии с функторами (одна из вещей, что раздражают меня в java — нельзя создать простой callback, приходится городить анонимные классы с именованными методами).
В C и C++ можно было взять указатель на функцию, это не делает функцию объектом, с одинаковым успехом можно написать:
int f() {
return 123;
}
/* будет работать */
int (*ptr)() = f;
(*ptr)();
/* допустимо, но никто не гарантирует, что это будет работать на конкретной машине */
int (*ptr)() = (int (*)()) 0xfe017c24h;
(*ptr)();
В C++11 появились лямбды.
bool c = true;
std::function<bool(int, int)> f = [&] (int a, int b) -> bool {
return c ? a < b : a > b;
}
/* ... */
c = true;
f(5, 3); // false
c = false;
f(5, 3); // true
Здесь уже никто не мешает взять ссылку, так как это полноценный объект, но стоит учесть, что это не настоящая функция, а синтаксический сахар для создания функтора, то есть код практически эквивалентен следующему:
struct __my_functor{
bool& c;
__my_functor(bool &c): c(c) {}
bool operator() (int a, int b) { return c ? a < b : a > b; }
};
/* ... */
bool c = true;
__my_functor f(c);
/* ... */
c = true;
f(5, 3); // false
c = false;
f(5, 3); // true
То есть в C++, благодаря перегрузке операторов, объект может прикинуться функцией, но функция не является объектом.
Решение с временным файлом будет немного универсальнее — кто знает, как много данных нужно записать? А вдруг память закончится?
Тем более, можно использовать что-то вроде:
На какие только извращения не идут люди, чтобы не использовать *nix.
Дело в том, что компиляция программы — действие единичное, а вот запуск — регулярное.
Подправьте немного код, чтобы можно было вводить элементы массива и условия поиска, и запустите поиск миллиард раз, в сумме времени компиляции и времени работы, время компиляции уже будет ничтожно мало.
#offtop
Подобным образом люди ошибаются регулярно.
Мне часто приходится наблюдать такое, когда я говорю знакомым, что использую gentoo в качестве основной системы. Я не отрицаю, что сборка с нуля системы и всего софта, что я использую (ну не совсем с нуля, а со stage3) на моем ноуте занимает чуть больше суток, однако я получаю очень быструю и стабильную систему. Можно пытаться возражать, что оптимизация под машину не дает прибавки скорости, но пока не попробуешь сравнить, не увидишь реальное положение дел. Я пробовал использовать дистрибутивы, использующие бинарные пакеты, субъективно, скорость работы сильно различается, я склонен думать, что это связано с тем, что я один раз потратил время на то чтобы подобрать длинную строку флагов компилятора и дождался окончания сборки.
Возможно, конечно, это связано с тем, что я прочитал половину фразы и перечитал её сначала — почему-то затрудняюсь читать курсив.
По стандарту не задается размер int, есть только рекомендация делать его равным машинному слову. на 64 битах машинное слово будет равно 64 битам, и размер int, скорее всего будет зависеть от настроек компилятора. Компиляторов много разных, поэтому с каким нибудь может получиться, что int имеет размер 64 бита. Попробовал добиться этого от GCC, но там для x86 и x86_64 размер int всегда равен 32 битам.
Да, в коде есть небольшая ошибка — в третьей снизу строке должно быть hdc вместо Device, иначе будет ошибка компиляции.
К слову мировой рекорд скорости (150 слов в минуту на протяжении 50 минут) был установлен именно с помощью раскладки Дворака. (точнее упрощенной раскладки Дворака), собственно та же женщина достигала 170 слов в минуту на короткие промежутки времени и выдала рекордные 216 слов в минуту.
В C++11 появились лямбды.
Здесь уже никто не мешает взять ссылку, так как это полноценный объект, но стоит учесть, что это не настоящая функция, а синтаксический сахар для создания функтора, то есть код практически эквивалентен следующему:
То есть в C++, благодаря перегрузке операторов, объект может прикинуться функцией, но функция не является объектом.
I.…
II.…
III.…
IV.…
V.…
Собственно дайджест:
I.…
II.…
III.…
IV.…
VI. (sic!)…
Однако, вы заставили меня прочитать пост несколько раз…
Тем более, можно использовать что-то вроде:
Относительно кратко и делает ту же работу.