#include <stdio.h>
#include <time.h>
clock_t t;
void tic() {
}
void toc() {
}
//это то, что делается при мономорфизации - типы можно передавать по значению
//код может инлайниться, а может и нет
void __attribute__ ((noinline)) shablonnoe_petushenie(int a, int b, int* c) {
*c = a + b;
}
// а вот это - трушный параметрический полиморфизм
// который можно и в dll запихнуть, например, т.е. неплохая штука для построения
// плагинов. Все лежит в коробке
typedef struct Dict_tag {
void (*add)(void*a, void* b, void* c);
} Dict;
void __attribute__ ((noinline)) bozhestvenniy_slovar(int* a, int* b, int* c) {
*c = *a + *b;
}
Dict intdict = { .add = &bozhestvenniy_slovar };
// код
int main() {
int SIZE = 100000000;
int* yoba
= malloc(SIZE
* sizeof(int));
for (int i = 0; i < SIZE; ++i) {
yoba[i] = i;
}
tic();
int sum1 = 0;
for (int i = 0; i < SIZE; ++i) {
intdict.add(&sum1, &yoba[i], &sum1);
}
toc();
tic();
int sum2 = 0;
for (int i = 0; i < SIZE; ++i) {
shablonnoe_petushenie(sum2, yoba[i], &sum2);
}
toc();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgpjbG9ja190IHQ7Cgp2b2lkIHRpYygpIHsKCXQgPSBjbG9jaygpOyAKfQoKdm9pZCB0b2MoKSB7CglwcmludGYoIiVkXG4iLCAgY2xvY2soKSAtIHQgKTsKfQoKCi8v0Y3RgtC+INGC0L4sINGH0YLQviDQtNC10LvQsNC10YLRgdGPINC/0YDQuCDQvNC+0L3QvtC80L7RgNGE0LjQt9Cw0YbQuNC4IC0g0YLQuNC/0Ysg0LzQvtC20L3QviDQv9C10YDQtdC00LDQstCw0YLRjCDQv9C+INC30L3QsNGH0LXQvdC40Y4KLy/QutC+0LQg0LzQvtC20LXRgiDQuNC90LvQsNC50L3QuNGC0YzRgdGPLCDQsCDQvNC+0LbQtdGCINC4INC90LXRggp2b2lkIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpIHNoYWJsb25ub2VfcGV0dXNoZW5pZShpbnQgYSwgaW50IGIsIGludCogYykgewoJKmMgPSBhICsgYjsKfQoKLy8g0LAg0LLQvtGCINGN0YLQviAtINGC0YDRg9GI0L3Ri9C5INC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQuSDQv9C+0LvQuNC80L7RgNGE0LjQt9C8Ci8vINC60L7RgtC+0YDRi9C5INC80L7QttC90L4g0Lgg0LIgZGxsINC30LDQv9C40YXQvdGD0YLRjCwg0L3QsNC/0YDQuNC80LXRgCwg0YIu0LUuINC90LXQv9C70L7RhdCw0Y8g0YjRgtGD0LrQsCDQtNC70Y8g0L/QvtGB0YLRgNC+0LXQvdC40Y8KLy8g0L/Qu9Cw0LPQuNC90L7Qsi4g0JLRgdC1INC70LXQttC40YIg0LIg0LrQvtGA0L7QsdC60LUKdHlwZWRlZiBzdHJ1Y3QgRGljdF90YWcgewogICAgdm9pZCAoKmFkZCkodm9pZCphLCB2b2lkKiBiLCB2b2lkKiBjKTsKfSBEaWN0OwoKdm9pZCBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSBib3poZXN0dmVubml5X3Nsb3ZhcihpbnQqIGEsIGludCogYiwgaW50KiBjKSB7CgkqYyA9ICphICsgKmI7Cn0KCkRpY3QgaW50ZGljdCA9IHsgLmFkZCA9ICZib3poZXN0dmVubml5X3Nsb3ZhciB9OwoKCi8vINC60L7QtAoKaW50IG1haW4oKSB7CglpbnQgU0laRSA9IDEwMDAwMDAwMDsKCQoJaW50KiB5b2JhID0gbWFsbG9jKFNJWkUgKiBzaXplb2YoaW50KSk7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyArK2kpIHsKCQl5b2JhW2ldID0gaTsKCX0KCQoJdGljKCk7CglpbnQgc3VtMSA9IDA7Cglmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7ICsraSkgewoJCWludGRpY3QuYWRkKCZzdW0xLCAmeW9iYVtpXSwgJnN1bTEpOwoJfQoJdG9jKCk7CglwcmludGYoIiVkXG4iLCBzdW0xKTsKCgl0aWMoKTsKCWludCBzdW0yID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CgkJc2hhYmxvbm5vZV9wZXR1c2hlbmllKHN1bTIsIHlvYmFbaV0sICZzdW0yKTsKCX0KCXRvYygpOwoJcHJpbnRmKCIlZFxuIiwgc3VtMik7CQoJCgoKCWZyZWUoeW9iYSk7CQoJcmV0dXJuIDA7Cn0=