Submitted via IRC for SoyCow3196
Why const Doesn't Make C Code Faster
In a post a few months back I said it's a popular myth that const is helpful for enabling compiler optimisations in C and C++. I figured I should explain that one, especially because I used to believe it was obviously true, myself. I'll start off with some theory and artificial examples, then I'll do some experiments and benchmarks on a real codebase: Sqlite.
Let's start with what I used to think was the simplest and most obvious example of how const can make C code faster. First, let's say we have these two function declarations:
void func(int *x);
void constFunc(const int *x);And suppose we have these two versions of some code:
void byArg(int *x)
{
printf("%d\n", *x);
func(x);
printf("%d\n", *x);
}void constByArg(const int *x)
{
printf("%d\n", *x);
constFunc(x);
printf("%d\n", *x);
}To do the printf(), the CPU has to fetch the value of *x from RAM through the pointer. Obviously, constByArg() can be made slightly faster because the compiler knows that *x is constant, so there's no need to load its value a second time after constFunc() does its thing. It's just printing the same thing. Right? Let's see the assembly code generated by GCC with optimisations cranked up:
(Score: 2) by hendrikboom on Sunday August 25 2019, @08:23PM (1 child)
In the original example, it's possible for the argument x to point into variables controlling printf's output buffer, so it'a very possible for *x to change even without calling another function.
(Score: 3, Insightful) by FatPhil on Monday August 26 2019, @06:18AM
Rather than saying "const didn't help the compiler optimise maximally, so don't bother using const", the article should have been "why doesn't the compiler do the optimisation I wanted?".
This is an article about how useless cars are for getting you places, in situations where the car is up on bricks.
Worse - this article hasn't even noticed the bricks.
Great minds discuss ideas; average minds discuss events; small minds discuss people; the smallest discuss themselves