#include <iostream>
#include <vector>
#include <cstdlib>
#include <chrono>
using namespace std;
struct base
{
int type;
virtual int get() = 0;
virtual ~base() {}
};
struct class1 : base
{
class1() { type = 1; }
virtual int get() { return 11; }
};
struct class2 : public base
{
class2() { type = 2; }
virtual int get() { return 27; }
};
class timer
{
using T = std::chrono::time_point<std::chrono::steady_clock>;
T t1, t2;
public:
void start() { t1 = std::chrono::steady_clock::now(); }
void stop() { t2 = std::chrono::steady_clock::now(); }
void print() const { std::cout << "Time: " << (t2 - t1).count() << endl; }
};
int main()
{
vector <base *> v;
int s = 0;
timer t;
srand(time(0));
for (unsigned q=0; q<50000000; ++q) v.push_back(rand()&1 ? (base*)new class1() : (base*)new class2());
t.start();
for (auto x : v) s += x->get();
t.stop();
cout << s << endl;
t.print();
for (auto x : v) delete x;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNocm9ubz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgYmFzZQp7CiAgaW50IHR5cGU7CiAgdmlydHVhbCBpbnQgZ2V0KCkgPSAwOwogIHZpcnR1YWwgfmJhc2UoKSB7fQp9OwoKc3RydWN0IGNsYXNzMSA6IGJhc2UKewogIGNsYXNzMSgpIHsgdHlwZSA9IDE7IH0KICB2aXJ0dWFsIGludCBnZXQoKSB7IHJldHVybiAxMTsgfQp9OwoKc3RydWN0IGNsYXNzMiA6IHB1YmxpYyBiYXNlCnsKICBjbGFzczIoKSB7IHR5cGUgPSAyOyB9CiAgdmlydHVhbCBpbnQgZ2V0KCkgeyByZXR1cm4gMjc7IH0KfTsKCmNsYXNzIHRpbWVyCnsKICB1c2luZyBUID0gc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz47CiAgVCB0MSwgdDI7CnB1YmxpYzoKICB2b2lkIHN0YXJ0KCkgeyB0MSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOyB9CiAgdm9pZCBzdG9wKCkgeyB0MiA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOyB9CiAgdm9pZCBwcmludCgpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJUaW1lOiAiIDw8ICh0MiAtIHQxKS5jb3VudCgpIDw8IGVuZGw7IH0KfTsKCmludCBtYWluKCkKewogIHZlY3RvciA8YmFzZSAqPiB2OwogIGludCBzID0gMDsKICB0aW1lciB0OwoKICBzcmFuZCh0aW1lKDApKTsKICBmb3IgKHVuc2lnbmVkIHE9MDsgcTw1MDAwMDAwMDsgKytxKSB2LnB1c2hfYmFjayhyYW5kKCkmMSA/IChiYXNlKiluZXcgY2xhc3MxKCkgOiAoYmFzZSopbmV3IGNsYXNzMigpKTsKCiAgdC5zdGFydCgpOwogIGZvciAoYXV0byB4IDogdikgcyArPSB4LT5nZXQoKTsKICB0LnN0b3AoKTsKICAKICBjb3V0IDw8IHMgPDwgZW5kbDsKICB0LnByaW50KCk7CgogIGZvciAoYXV0byB4IDogdikgZGVsZXRlIHg7CgogIHJldHVybiAwOwp9