вторник, 8 июня 2010 г.

Медленный memset

Часто в "оптимизированных" программах можно увидеть такой способ "инициализации" данных
в конструкторе:

class A
{
public:
A() { std::memset(this, 0, sizeof(A)); }
private:
int a;
};

Авторы такого подхода часто признают его ограниченность, ведь с виртуальными функциями и наследованием он работает некорректно. Но более любопытен другой факт, на который часто не обращают внимания. При компиляции эта конструкция превращается в цикл со сравнениями и переходами, что существенно медленнее "тупой" инициализации присваиванием:

class A
{
public:
A() : a(0) {}
private:
int a;
};