4 ms·
There was a C library - posted here but I cannot remember the name - which used the preprocessor to avoid invoking a function call per comparison. You'd use it
by derriz 4y ago
There was a C library - posted here but I cannot remember the name - which used the preprocessor to avoid invoking a function call per comparison. You'd use it something like this:
#define SORT_ELEMENT_TYPE int
#define SORT_COMPARE(a, b) sign(a - b)
#include "specialized_sort.h"
And the header would define a function with the following signature:
int sort_int(int[] a, size_t n);
- jhallenworld 4y agoI've written code just like this. Another option is to make the entire sort function a C macro. This would be feasible for something simple like quicksort. But generics provide another benefit: in theory with them, the compiler should be able to determine that two high-level types are actually the same machine type, so in the above example, SORT_ELEMENT_TYPE int and long would not generate duplicate code on many machines.
- randbox 4y agoIt's not necessary to use macros. Just make both the sort function which the comparison function is passed to, as well as the comparison function itself, both "static inline". The compiler is smart enough to figure it out.
- KapKap55 4y agoMaybe not it, but STC (https://github.com/tylov/STC https://github.com/tylov/STC) and CTL (https://github.com/glouw/ctl https://github.com/glouw/ctl) both use this define method for creating data structures and linking up compare functions for them.