Создаём систему мониторинга монстров (СММ): День 1

(Перевод, оригинал статьи: https://www.scylladb.com/2017/11/30/mutant-monitoring-system-day-1/)

В этой серии статей мы расскажем вам историю, которая послужит материалом для изучения Scylla.

Предыстория

Нашу планету заполонили монстры, и они сеют панику и разрушение! В связи с их вредоносной деятельностью возникла угроза безопасности людей и целых стран. К счастью, среди них есть монстры, которые сотрудничают с правительством и помогают защитить людей от своих злых собратьев по виду.

Чтобы лучше защитить граждан и узнать больше о монстрах, правительство ввело в действие Закон о Регистрации Монстров. Согласно этому закону, каждый монстр обязан носить на себе маленькое устройство, которое будет ежесекундно отчитываться о его действиях.

Вы — представитель Отдела 3, созданного, чтобы помочь государству защитить людей от монстров. Ваша задача — создать систему мониторинга монстров (СММ). СММ будет состоять из базы данных, в которой хранится список (каталог) монстров, и системы мониторинга.

Continue reading “Создаём систему мониторинга монстров (СММ): День 1”

Advertisements

What will you see if compile and run following simple program (first try answering in mind before actually compiling it)? 🙂

int main() {
    std::cout << (sizeof(char *) == 8) ? "64-bit" : "32-bit";
    return 0;
}

You can view all the predefined macros through command-line switches with some compilers. This works with gcc and icc (Intel’s C++ compiler):

$ touch empty.cpp

$ g++ -E -dM empty.cpp | sort >gxx-macros.txt

$ icc -E -dM empty.cpp | sort >icx-macros.txt

$ touch empty.c

$ gcc -E -dM empty.c | sort >gcc-macros.txt

$ icc -E -dM empty.c | sort >icc-macros.txt

The complexity of std::list::size() operation is O(N) while for other standard containers (vector, queue) and std::string it is O(1).

This is caused by splice() operation specific to lists that takes some range of elements from one list and inserts it to the specified position of another one.

This splicing is done with O(1) complexity and is extremely useful in some cases but it blocks all the opportunities for storing/knowing list length.

Pure virtual function can have body in base class too.

#include <iostream>

struct A
{
    virtual void foo() = 0;
};

void A::foo() {
    std::cout << "A::foo()" << std::endl;
}

struct B : A
{
    virtual void foo()
    {
        A::foo();
        std::cout << "B::foo()" << std::endl;
    }
};

int main()
{
    B b;
    b.foo();
    return 0;
}

Unions can be templates too.

template<typename From, typename To>
union union_cast {
    From from;
    To   to;
 
    union_cast(From from)
        :from(from) { }
 
    To getTo() const { return to; }
};
And they can have constructors and member functions too. Just nothing that has to do with inheritance (including virtual functions).