可以在编译时用C对元素排序吗?
语法是次要的,我想到了这样一个宏:
SORT(9, -1, 12, 4) // expands to: -1, 4, 9, 12
SORT(dog, cat, cow) // expands to: cat, cow, dog
但是我不会对任何API皱眉,只要它不发出一个CPU指令就可以排序。
要求相当宽松:
sort
或自制的代码生成器不受欢迎,因为它们使构建步骤复杂化。SORT_5
来对5元素进行排序是可以的。我意识到这个解决方案可能会求助于一些几乎无法编译的语言巫毒,我只是想知道它是否可能。
发布于 2015-03-25 16:32:39
下面是一个宏方法:
#define GET_1_of_3(a, b, c) ((a) < (b) ? ((c) < (a) ? (c) : (a)) : ((c) < (b) ? (c) : (b)))
#define GET_2_of_3(a, b, c) ((c) > (a) && (c) < (b) || (c) < (a) && (c) > (b) ? (c) : ((b) > (a) && (b) < (c) || (b) < (a) && (b) > (c) ? (b) : (a)))
#define GET_3_of_3(a, b, c) ((a) > (b) ? ((c) > (a) ? (c) : (a)) : ((c) > (b) ? (c) : (b)))
#define SORT_3(a, b, c) GET_1_of_3(a, b, c),GET_2_of_3(a, b, c),GET_3_of_3(a, b, c)
void main(){
int x[3] = { SORT_3(6,2,3) };
printf("%d, %d, %d", x[0], x[1], x[2]);
}
这适用于int
,也适用于C语言,但是没有const_expr
来自C++的字符串是不可能的。显然,您需要大量的宏编写来支持大量的SORT_X
。
发布于 2015-03-25 16:38:51
让我们考虑排序只能是0或1的数字。对于两个数字,下面代码中的SORT2
可以对它们进行排序:
#define SORT2(a,b) SORT2_##a##b
#define SORT2_00 0,0
#define SORT2_01 0,1
#define SORT2_10 0,1
#define SORT2_11 1,1
当然,这可以扩展到更大的范围和更多的参数。
发布于 2015-03-29 02:15:19
实际上,您不能在编译时对C进行排序(至少如果您希望排序足够多的编译时常量整数;在这种情况下,有300个宏或函数名为SORT_1
、SORT_2
、. SORT_300
是不实际的,除非您生成这些函数或宏,而您不想这样做).
实用的方法是使用您自己的或其他的预处理程序(例如gpp),并让它进行排序。或者简单地说,在包含的文件中包含数字并生成排序的文件(例如,使用make
规则使用awk
& sort
)
您还可以考虑使用链路时间优化链接到LTO编译的libc,使用其LTO优化的qsort
。这并不常见,AFAIK,您不能保证编译器是智能的-足够内联您的LTO qsort
等.(AFAIK,当前的C编译器不这样做)。
如果使用最新的GCC进行编译(2015年3月使用4.8、4.9或5.0 ),您可以定制它(例如使用熔化或自己的C++插件)来定义您的__builtin_my_compile_time_sort
(或者某些_Pragma
)来完成这项工作。这是编译器特有的(可能意味着几天的工作,除非您已经知道了)
最简单的事情是接受稍微复杂的构建步骤。这没什么大不了的。
https://stackoverflow.com/questions/29268723
复制