首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现memcmp

实现memcmp
EN

Stack Overflow用户
提问于 2011-02-16 14:31:58
回答 8查看 7.9K关注 0票数 5

以下是memcmp的Microsoft CRT实现:

代码语言:javascript
复制
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));
}

它基本上是逐字节进行比较。

我的问题分两部分:

  1. 是否有任何理由不将其修改为int的整数比较,直到count < sizeof(int),然后逐字节比较剩余的内容?如果我要做1,有什么潜在的/明显的问题吗?

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

EN

回答 8

Stack Overflow用户

发布于 2011-02-16 14:34:56

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

您必须注意的两件事(至少)是在开始和结束时的悬念,以及这两个区域之间的排列是否不同。

如果您访问值而不遵循它们的对齐规则,一些处理器运行得更慢(如果您尝试,有些甚至会崩溃)。

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

这种额外的代码复杂性是否值得--无论节省多少钱--取决于许多超出您控制范围的因素。一种可能的方法是检测两个区域对齐一致的理想情况,并以一种快速的方式进行,否则只需逐个字符地对齐。

票数 7
EN

Stack Overflow用户

发布于 2011-02-16 14:36:35

您提出的优化是非常常见的。最大的问题是,如果您试图在一个处理器上运行它,除了一个字节之外,它不允许对齐访问,或者在该模式下运行得更慢;x86家族没有这个问题。

它也更复杂,因此更有可能包含一个bug。

票数 5
EN

Stack Overflow用户

发布于 2011-02-17 05:16:25

不要忘记,当您发现一个较大块中的不匹配时,您必须在该块中标识第一个不同的char,以便计算正确的返回值(memcmp()返回第一个不同字节的差值,作为unsigned char值处理)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5017659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档