【发布时间】:2013-05-07 02:22:10
【问题描述】:
是否有相当标准的 C (Linux) 函数或代码效率高但性能良好的方法来比较任意大小的两个整数?
我正在寻找带有参数int intcmp(const void *a, const void *b, size_t size) 的东西,它适用于整数a 和b,适用于任何实际大小size。 (memcmp() 会工作(我认为)如果架构是大端的。)
我倾向于使用的实现是这样的(从 Efficient integer compare function 改进),但它并不完全通用,并且有足够的代码开销,我通常会在插入之前三思而后行。
int intcmp(const void *a, const void *b, size_t size) {
#define CASE_SIZE_RETURN_A_B_CMP(_t) \
case sizeof(_t): \
return ((*(_t *)(a) > *(_t *)(b)) - (*(_t *)(a) < *(_t *)(b)))
switch (size) {
CASE_SIZE_RETURN_A_B_CMP(char);
CASE_SIZE_RETURN_A_B_CMP(short);
CASE_SIZE_RETURN_A_B_CMP(int);
CASE_SIZE_RETURN_A_B_CMP(long long);
}
#undef CASE_SIZE_RETURN_A_B_CMP
assert(0);
return 0;
}
【问题讨论】:
-
我怀疑这是否有标准功能。请注意,如果您需要有符号和无符号类型,您的解决方案将不起作用。
-
一旦你写到“任意大小的整数”,我认为你已经超出了“如果架构是大端”所涵盖的范围,因为那种低级架构考虑不允许任意大小的整数。相反,您需要决定您打算如何表示(例如)1024 位整数,然后相应地编写您的函数。
-
为什么不在需要的地方使用更简单的宏内联版本?
-
如果您的任意大小仅限于预定义的数据类型(看起来像您的帖子中的那样),我会采用您的方法,不使用宏,使用上述宏您不会获得任何东西,而是阅读起来更复杂。
-
如果您在 C 程序中需要这样的函数,那么您可能做错了,即可能需要重新设计调用该函数的代码。如果你真的需要这样做,你应该考虑使用 C++ 及其模板或者 C11 的通用函数。如果没有其他可能,您的解决方案还不错,可能是您可以拥有的最好的解决方案(尽管我可能不会使用宏,尽管代码重复)。
标签: c