Home > database >  Compiler optimizations on map/set in c
Compiler optimizations on map/set in c

Time:10-19

Does compiler make optimzation on data structures when input size is small ?

    unordered_set<int>TmpSet;
    TmpSet.insert(1);
    TmpSet.insert(2);
    TmpSet.insert(3);
    ...
    ...

Since since is small using hashing would be not required we can simply store this in 3variables. Do optimization like this happen ? If yes who is responsible for them ?

edit: Replaced set with unordered_set as former doesn't do hasing.

CodePudding user response:

Possible in theory to totally replace whole data structures with a different implementation. (As long as escape analysis can show that a reference to it couldn't be passed to separately-compiled code).

But in practice what you've written is a call to a constructor, and then three calls to template functions which aren't simple. That's all the compiler sees, not the high-level semantics of a set.

Unless it's going to optimize stuff away, real compilers aren't going to use a different implementation which would have different object representations.

If you want to micro-optimize like this, in C you should do it yourself, e.g. with a std::bitset<32> and set bits to indicate set membership.

It's far too complex a problem for a compiler to reliably do a good job. And besides, there could be serious quality-of-implementation issues if the compiler starts inventing different data-structures that have different speed/space tradeoffs, and it guesses wrong and uses one that doesn't suit the use-case well.

Programmers have a reasonable expectation that their compiled code will work somewhat like what they wrote, at least on a large scale. Including calling those standard header template functions with their implementation of the functions.

Maybe there's some scope for a C implementation adapting to the use-case, but I that would need much debate and probably a special mechanism to allow it in practice. Perhaps name-recognition of std:: names could be enough, making those into builtins instead of header implementations, but currently the implementation strategy is to write those functions in C in .h headers. e.g. in libstdc or libc .

  • Related