Нет никаких накладных расходов с const
, я думаю, ваши коллеги просто запутались с использованием, поскольку это (к сожалению) не так часто.Лично я предпочитаю const
как можно больше локальных переменных, поскольку это повышает удобочитаемость.
Конечно, это всегда легко опровергнуть, взять следующую программу и скомпилировать с выводом сборки:
#include <stdio.h>
void foo1(int a, double b)
{
printf("Not const %d, %g\n", a, b);
}
void foo2(const int a, const double b)
{
printf("Const %d, %g\n", a, b);
}
int main()
{
for(int i = 0; i < 10; ++i)
{
foo1(i, 5.5 * i);
foo2(i, 12.8 * i);
}
return 0;
}
Код ассемблера, сгенерированный для этих функций, точно такой же (с использованием версии выпуска VS2010):
Для foo1
(без const
-спецификаторов):
; 4 : {
push ebp
mov ebp, esp
; 5 : printf("Not const %d, %g\n", a, b);
fld QWORD PTR _b$[ebp]
sub esp, 8
fstp QWORD PTR [esp]
push eax
push OFFSET ??_C@_0BC@FACFPKBC@Not?5const?5?$CFd?0?5?$CFg?6?$AA@
call DWORD PTR __imp__printf
add esp, 16 ; 00000010H
; 6 : }
Для foo2
(с указанием const
):
; 9 : {
push ebp
mov ebp, esp
; 10 : printf("Const %d, %g\n", a, b);
fld QWORD PTR _b$[ebp]
sub esp, 8
fstp QWORD PTR [esp]
push eax
push OFFSET ??_C@_0O@LOLEPDHC@Const?5?$CFd?0?5?$CFg?6?$AA@
call DWORD PTR __imp__printf
add esp, 16 ; 00000010H
; 11 : }