static __attribute__((noinline)) voidmerge_i(data_t* A, int p, int q, int r); static __attribute__((noinline)) voidcopy_i(data_t* source, data_t* dest, int n);
可能带来的性能劣势:如果在一个文件中多次调用内联函数,多次展开,那整个程序的体积就会变大,在一定程度上,会造成 CPU 的取址效率降低,程序执行效率降低。同时如果在inline扩展之前,程序频繁执行的部分适合内存层次结构的一个级别(例如,L1缓存),但是在扩展之后它不再适合,导致该级别的缓存频繁丢失,导致程序效率降低。
voidsort_f_wrap(data_t *A, int p, int r, data_t *left) { assert(A); if (r - p < C) { isort(A + p, A + r); return; } if (p < r) { int q = (p + r) / 2; sort_f_wrap(A, p, q, left); sort_f_wrap(A, q + 1, r, left); merge_f(A, p, q, r, left); } }
voidsort_f(data_t *A, int p, int r) { staticdata_t *left = NULL; mem_alloc(&left, (r - p + 2) / 2); if (left == NULL) { mem_free(&left); return; } sort_f_wrap(A, p, r, left); mem_free(&left); }
// A merge routine. Merges the sub-arrays A [p..q] and A [q + 1..r]. // Uses two arrays 'left' and 'right' in the merge operation. staticinlinevoidmerge_f(data_t *A, int p, int q, int r, data_t *left) { assert(A); assert(p <= q); assert((q + 1) <= r); int n1 = q - p + 1; int n2 = r - q;