实现memcmp

int*_*nds 5 c c++ memcmp

以下是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));
}
Run Code Online (Sandbox Code Playgroud)

它基本上执行逐字节比较.

我的问题分为两部分:

  1. 是否有任何理由不通过int比较将此更改为int count < sizeof(int),然后逐字节比较为剩下的内容做什么?
  2. 如果我做1,是否有任何潜在/明显的问题?

注意:我根本不使用CRT,所以无论如何我必须实现这个功能.我只是在寻找有关如何正确实现它的建议.

pax*_*blo 6

如果您愿意,可以将其作为int-by-int比较或更广泛的数据类型.

您必须注意的两件事(至少)是开始和结束时的悬垂,以及两个区域之间的对齐是否不同.

如果您在不遵循其对齐规则的情况下访问值,某些处理器运行速度较慢(有些甚至会在您尝试时崩溃).

因此,您的代码可能会进行char比较直到int对齐区域,然后int进行比较,然后char再次进行比较,但同样,两个区域的对齐可能很重要.

这些额外的代码复杂性是否值得您获得的节省取决于您无法控制的许多因素.一种可能的方法是检测理想情况,其中两个区域对齐并以快速方式进行,否则只是逐个字符地进行.

  • 这种优化是否也要求*两个*指针在开始时都以相同的量突出. (2认同)

Mar*_*som 5

您提出的优化非常常见.最大的问题是,如果您尝试在不允许对单个字节以外的任何其他任何内容进行未对齐访问的处理器上运行它,或者在该模式下运行速度较慢; x86系列没有这个问题.

它也更复杂,因此更容易包含bug.

  • 性能需要对_both_指针进行对齐访问(特别是在使用128位sse时).参见[即使在x86机器上的对齐的重要性](http://blogs.msdn.com/b/oldnewthing/archive/2004/08/27/221486.aspx)(诚然从2004年开始,但是应该给你一些关于骇人听闻的恐怖). (2认同)