Stories
Slash Boxes
Comments

SoylentNews is people

posted by Fnord666 on Sunday August 25 2019, @01:57PM   Printer-friendly
from the quite-the-contrary dept.

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:


Original Submission

 
This discussion has been archived. No new comments can be posted.
Display Options Threshold/Breakthrough Mark All as Read Mark All as Unread
The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
  • (Score: 2) by hendrikboom on Sunday August 25 2019, @08:23PM (1 child)

    by hendrikboom (1125) Subscriber Badge on Sunday August 25 2019, @08:23PM (#885357) Homepage Journal

    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.

    Starting Score:    1  point
    Karma-Bonus Modifier   +1  

    Total Score:   2  
  • (Score: 3, Insightful) by FatPhil on Monday August 26 2019, @06:18AM

    by FatPhil (863) <reversethis-{if.fdsa} {ta} {tnelyos-cp}> on Monday August 26 2019, @06:18AM (#885538) Homepage
    Yeah, a 'restrict' would have made the example better.

    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