Оказывается, за весь 2008й год не было ни одного поста про ценник абстракции. Это недопустимо, надо исправлять. Сегодня мы узнаем, как поиметь +30% в одну строчку, заменив if ( bool-flag ) на (int)bool-flag.
В коде случился такой паттерн: у объекта есть два указателя на разные куски в памяти, в зависимости от флажка надо выбирать либо по 1му, либо по 2му. (Для справки, это некая статическая часть данных, которая расшарена между несколькими копиями объектов, и динамическая часть, которая очень личная и которой объект владеет).
Написал return bDynamic ? m_pDynamic[iOffset] : m_pStatic[iOffset], слегка задумался. Поля m_pStatic и m_pDynamic в объекте лежат подряд. bool bDynamic хоть и занимает целый байт, принимает все равно значения 0 и 1. Догадается компилятор заменить это дело на (*(&m_pStatic+bDynamic))[iOffset], и выгоднее ли это?
Результаты MSVC 2005: да, выгоднее на 30%. Нет, не догадывается.
Результаты gcc 4.2.3: не уверен, что правильно понимаю ассемблерную нотацию, но похоже, догадывается сразу. Поэтому разницу померить не удается, результаты одинаковые.
Код бенчмарка под катом.
Continue reading ‘Цена абстракции-4 (или все, что мама не рассказывала про C++)’ »