Комментарии 28
Можно попробовать метапрограммирование функции Аккермана, это уж точно взорвет мозг компиляторам :)
+4
Да пробовал. Но она слишом быстро растет. A(4,4) — и уже рядом с бесконечностью :)
Вот здесь пример брал
Вот здесь пример брал
+1
НЛО прилетело и опубликовало эту надпись здесь
А(4, 4) и не надо. А(3, 25) вполне хватит — там значение порядка десятков миллионов.
0
Несмотря на всю бессмысленность, спортивный интерес требует попробовать выжать больше;)
+3
Более чем уверен что это не предел.
0
помню как-то давно, по молодости, пытался «пойдя легким путем» реализовать деление 1024-битных чисел, через шаблон, который «удваивает разрядность», т.е. имея параметром 32х битный тип, шаблон реализовывал деление и ряд других операций на 64х битах, потом 64х битный тип шел параметром следующей инстанциации дающей на выходе 128 бит, итп. Итоговый код для 1024 и 2048 компилировался очень долго на моем тогдашнем P2 ;)
0
А вы не пробовали получившиеся exe файлы на то, как хорошо они сжимаются архиваторами? Просто ради любопытства праздного, — если там много повторяющихся бинарных последовательностей, то сжаться должен хорошо, и в свою очередь если там их будет много, это говорит о том, что в теории компиляторы могут оптимизировать такой код лучше. (С другой стороны если не сожмется — то это ни о чем не скажет вовсе ;) )
0
сжатие это палка о двух концах — если сжать такой файл при помощи UPX — то в RAM получим 2 копии — (1) сжатые данные (2) распакованные данные
-1
Безусловно они хорошо сжимаются. Там большое количество операций add(addsd, addq ...) или nop для первого раздела. Bzip сжал самый большой бинарник c 53MB до 6.6.
0
Извините, если может глупость спрошу, а strip вы делали бинарникам?
+3
Немного изменив изначальный вариант:
на VC++ 2012 с -O2 получил 400 Мб.
Так конечно не интересно, но поставленную задачу
решает.
template<long N> struct Nop {
static int nop() {
static const size_t arraySize = 10240;
static const long a[arraySize] = {N};
auto t = ::time(nullptr);
auto i = static_cast<size_t>(static_cast<double>(t) / static_cast<double>(MAX_LONG) * arraySize);
return Nop<N - 1>::nop() + static_cast<int>(a[i]);
}
};
template<> struct Nop<0> { static int nop() { return 0; } };
int main() {
return Nop<10000>::nop();
}
на VC++ 2012 с -O2 получил 400 Мб.
Так конечно не интересно, но поставленную задачу
получить из минимума строк кода исполняемый файл максимально возможного размера
решает.
+1
Попробовал этот код для g++, clang++, icpc.
g++ и icpc выдали одинаковый размер в 783MB
clang++ — засегфолтился.
Суммарный рамер массивов — (10240*8*10000)/(1024*1024) == 781MB.
400МБ — наверное, для 32-битной машины.
g++ и icpc выдали одинаковый размер в 783MB
clang++ — засегфолтился.
Суммарный рамер массивов — (10240*8*10000)/(1024*1024) == 781MB.
400МБ — наверное, для 32-битной машины.
0
Если разрешить статические массивы, то никакие шаблоны не нужны. Вот программа в две строки, которая для g++ -O3 дает файл размером около 1 ГБ:
volatile char A[1000000000] = { 3 };
int main() { }
+1
Наблюдаем эту проблему при использовании template haskell. С типами всё хорошо, а вот размер исполняемого файла при этом — мегабайт 20-30.
+1
Было бы удивительно увидеть одинаковые глубины рекурсии между обычным компилятором и clang. У них же фундаментальные отличия.
0
По-хорошему, форк-бомба всё-таки должна быть корекурсивной. Например
#include <vector>
#include <list>
using std::vector;
using std::list;
template<typename T>
int doStuff(T a) {
return doStuff( vector<T>() ) + doStuff( list<T>() );
}
int main() {
doStuff<int>(5);
return 0;
}
0
Да, пожалуй. Но чтобы оценить возможную «поражающую силу» удобно простую рекурсию задействовать. А это даже компилировать как-то боязно.:) Хотя не — вылетела по памяти как и остальные.
0
В таком формате форк-бомбы невозможно добиться успешной компиляции.
0
А зачем это?
0
Вот что пишет автор в начале статьи:
Если файл не получился — то он никак не подходит под определение «файл максимально возможного размера».
Но давайте вывернем проблему наизнанку и попробуем получить из минимума строк кода исполняемый файл максимально возможного размера.
Если файл не получился — то он никак не подходит под определение «файл максимально возможного размера».
0
Ок, если мы ставим своей целью файл максимального размера, то согласен, мой вариант не к месту.
Если же мы хотим fork-бомбу, жадно поглощающую все доступные ресурсы, то предложенный код, имхо, имеет право на существование.
Если же мы хотим fork-бомбу, жадно поглощающую все доступные ресурсы, то предложенный код, имхо, имеет право на существование.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Несколько подробностей о шаблонах или форк-бомба этапа компиляции