Я заинтересован в написании хорошего кода с самого начала вместо оптимизации кода позже. Извините, что не предоставил тест. У меня нет рабочего сценария на данный момент. Спасибо за внимание!
Каков прирост производительности при использовании FunctionY по сравнению с FunctionX?
Об этом уже идет много дискуссий о stackoverflow, но я сомневаюсь, что при доступе к подчиненным элементам (рекурсивным), как показано ниже. Будет ли компилятор (скажем, VS2008) оптимизировать FunctionX во что-то вроде FunctionY?
void FunctionX(Obj * pObj)
{
pObj->MemberQ->MemberW->MemberA.function1();
pObj->MemberQ->MemberW->MemberA.function2();
pObj->MemberQ->MemberW->MemberB.function1();
pObj->MemberQ->MemberW->MemberB.function2();
..
pObj->MemberQ->MemberW->MemberZ.function1();
pObj->MemberQ->MemberW->MemberZ.function2();
}
void FunctionY(Obj * pObj)
{
W * localPtr = pObj->MemberQ->MemberW;
localPtr->MemberA.function1();
localPtr->MemberA.function2();
localPtr->MemberB.function1();
localPtr->MemberB.function2();
...
localPtr->MemberZ.function1();
localPtr->MemberZ.function2();
}
В случае, если ни один из указателей участника не является изменчивым или указателем на изменчивым, и у вас нет operator ->
перегружены для любых членов в цепочке обе функции одинаковы.
Предложенное вами правило оптимизации широко известно как устранение общего выражения и поддерживается подавляющим большинством компиляторов в течение многих десятилетий.
Теоретически, вы экономите на дополнительных разыменованиях указателей, ОДНАКО в реальном мире компилятор, вероятно, оптимизирует его для вас, так что это бесполезная оптимизация.
Вот почему важно сначала профилировать, а потом оптимизировать. Компилятор делает все возможное, чтобы помочь вам, вы также можете убедиться, что вы не просто делаете то, что уже делают.
если компилятор достаточно хорош, он должен перевести functionX во что-то похожее на functionY.
Но вы можете получить разные результаты на разных компиляторах и на одном и том же компиляторе с разными флагами оптимизации.
Использование «тупой» функции компилятора должно быть более быстрым, и ИМХО, оно более читабельно и быстрее для кодирования. Так что придерживайтесь функции Y
пс. Вы должны взглянуть на какое-нибудь руководство по стилю кода, обычно имя члена и функции всегда должно начинаться со строчной буквы