вторник, 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;
};

понедельник, 19 апреля 2010 г.

Функция main() в C++

Любая программа на C++ должна содержать функцию main(), которая является точкой входа в программу.
Функцию main() нельзя предопределять и/или перегружать. Ее нельзя вызывать из программы. Нельзя объявлять inline или static.
Тип возвращаемого значения для функции main() - только int. Некоторые компиляторы (например, Microsoft) допускают объявление функции main() и с типом возвращаемого значения void. Но это не соответствует стандарту и, соответственно, непереносимо.
Все компиляторы должны поддерживать следующие варианты функции main():
int main()
{
}
и
int main(int argc, char* argv[])
{
}

Соответственно, все остальные варианты непереносимы, так как компиляторы не обязаны их поддерживать.
В теле функции может не быть инструкции return. Компилятор должен интерпретировать это как наличие return 0;.

вторник, 16 марта 2010 г.

Тесты по с++

Я уже писал про обучение для разработчиков. Один из лучших способов в этом деле - написание своих программ. Однако при разработке своего собственного программного обеспечения я обычно иду уже проторенными дорогами. Поэтому если не пишу что-то принципиально новое для меня, то это просто повторение пройденного. Для освежения своих знаний языка и нахождения "белых пятен" очень полезно проходить тесты. Они помогут также подготовиться к собеседованиям и экзаменам.
В интернете есть ряд хороших тестов, например на сайтах www.certifications.ru и brainbench.com. Второй является очень популярным, и его результат учитывается многими работодателями. Однако для обучения они подходят плохо. Так как после прохождения теста нельзя узнать, ответы на какие именно вопросы были неправильны.
Более удобный сервис предлагает сайт www.quizful.net. Там можно найти тесты разных уровней сложности и направлений. И самое удобное, после прохождения теста можно просмотреть результаты. В результатах вы увидите и свои ошибки, и верные ответы, и пояснения.

четверг, 14 января 2010 г.

Размеры классов

Какой размер имеет пустой класс в c++?
Например, такой:
class A {};
Экспериментальным путем у меня получилось 1 байт (на платформе win32 [GCC 3.4.2 и Visual C++ 2005]).
Если в классе появляется хоть что-то виртуальное...
Так:
class B
{
virtual ~B();
};
Или так:
class C: virtual public A
{
};
То размеры B и С сразу становится равными 4-м байтам.
Есть еще интересный момент.
Такой класс:
class D
{
bool d;
};
Будет иметь размер 1 байт.
А такой:
class E
{
virtual ~E();
bool e;
};
Уже 8.