teoretycznie te, bez odniesienia mogą być kopiowane w pamięć, ponieważ istnieje możliwość, że twoja funkcja inline może je modyfikować (nawet jeśli tak naprawdę nie jest).
W wielu przypadkach kompilator jest wystarczająco inteligentny, aby wybrać takie rzeczy, ale zależy to od ustawień kompilatora i optymalizacji. Także jeśli twoja funkcja wywoła jakiekolwiek niestanowiące członka funkcje w zmiennych klasowych, twój kompilator będzie musiał być wystarczająco inteligentny, by sprawdzić, czy też coś modyfikuje.
Używając odniesienia do stałej wartości można w zasadzie nadać jej dość wyraźne wskazanie.
EDYCJA: Wystarczy spojrzeć na kod maszynowy dla prostego test program skompilowany z GCC 4.6 w ddd. Wygenerowany kod wydawał się identyczny, więc wydaje się, że został zoptymalizowany. Wciąż jest to dobra praktyka dla innych kompilatorów i jeśli nic innego nie daje wyraźnego wskazania intencji kodu. Możliwe jest również, że istnieją bardziej złożone sytuacje, których kompilator nie może jednak zoptymalizować.
Również tam llvm online dissembler demo pokazuje identyczny bitcode. Jeśli wyłączysz optymalizację, jest ona nieco dłuższa bez odniesienia do stałej.
* 1964 bajtów - Brak stałych odniesień (i żadnych innych stałych w funkcjach/parametrach)
* 1960 bajtów - Po prostu nie ma odniesienia const, ale inne stałe.
* 1856 bajtów - z odwołaniami do stałych i stałych.
Wartość jest wartością, a odniesienie jest odniesieniem.Przekazywanie odwołania const, gdy znaczenie zamiast podania wartości jest błędem, który może źle się ugryźć. Zobacz http://stackoverflow.com/questions/4705593/int-vs-const-int/4705871#4705871 – 6502
@ 6502: Jest to świetny przykład przypadku, w którym użycie odwołania powoduje, że logika jest bardziej skomplikowana ('v.push_back (v [0]) 'jest legalne, ponieważ biblioteka standardowa musi zawierać tę dodatkową logikę). –
@BenVoigt: Miło widzieć to żądanie zostało dodane do standardu. Gdzie to jest napisane? – 6502