以下是memcmp的Microsoft CRT实现:
int memcmp(const void* buf1,
const void* buf2,
size_t count)
{
if(!count)
return(0);
while(--count && *(char*)buf1 == *(char*)buf2 ) {
buf1 = (char*)buf1 + 1;
buf2 = (char*)buf2 + 1;
}
return(*((unsigned char*)buf1) - *((unsigned char*)buf2));
}它基本上是逐字节进行比较。
我的问题分两部分:
count < sizeof(int),然后逐字节比较剩余的内容?如果我要做1,有什么潜在的/明显的问题吗?。
注意:我根本不使用CRT,所以我必须实现这个功能。我只是在寻求关于如何正确实现它的建议。
发布于 2011-02-16 14:34:56
如果您愿意的话,可以将其作为int-by int比较或更广泛的数据类型进行。
您必须注意的两件事(至少)是在开始和结束时的悬念,以及这两个区域之间的排列是否不同。
如果您访问值而不遵循它们的对齐规则,一些处理器运行得更慢(如果您尝试,有些甚至会崩溃)。
因此,您的代码可能会进行char比较,直到一个int对齐区域,然后再进行int比较,然后再进行char比较,但是,同样,这两个区域的对齐可能很重要。
这种额外的代码复杂性是否值得--无论节省多少钱--取决于许多超出您控制范围的因素。一种可能的方法是检测两个区域对齐一致的理想情况,并以一种快速的方式进行,否则只需逐个字符地对齐。
发布于 2011-02-16 14:36:35
您提出的优化是非常常见的。最大的问题是,如果您试图在一个处理器上运行它,除了一个字节之外,它不允许对齐访问,或者在该模式下运行得更慢;x86家族没有这个问题。
它也更复杂,因此更有可能包含一个bug。
发布于 2011-02-17 05:16:25
不要忘记,当您发现一个较大块中的不匹配时,您必须在该块中标识第一个不同的char,以便计算正确的返回值(memcmp()返回第一个不同字节的差值,作为unsigned char值处理)。
https://stackoverflow.com/questions/5017659
复制相似问题