سؤال

وفق مستندات مجلس التعاون الخليجي, ، memcmp ليست وظيفة جوهرية لدول مجلس التعاون الخليجي.إذا كنت تريد تسريع memcmp الخاص بـ glibc ضمن gcc، فستحتاج إلى استخدام العناصر الجوهرية ذات المستوى الأدنى المحددة في المستندات.ومع ذلك، عند البحث عبر الإنترنت، يبدو أن العديد من الأشخاص لديهم انطباع بأن memcmp هي وظيفة مدمجة.هل هو لبعض المترجمين وليس للآخرين؟

هل كانت مفيدة؟

المحلول

وصلتك يبدو أن لإلى x86 العمارة محددة المدمج في وظائف، وفقا ل<لأ href = "http://ftp.sunsite.ualberta.ca/Documentation/Gnu/gcc-3.0.2/html_node/ gcc_113.html "يختلط =" نوفولو noreferrer "> يتم تنفيذ هذا memcmp باعتبارها العمارة مستقلة المدمج في دول مجلس التعاون الخليجي من قبل.

وتحرير:

وتجميع التعليمات البرمجية التالية مع سيغوين دول مجلس التعاون الخليجي النسخة 3.3.1 لi686، -O2:

#include <stdlib.h>

struct foo {
    int a;
    int b;
} ;

int func(struct foo *x, struct foo *y)
{
    return memcmp(x, y, sizeof (struct foo));
}

وتنتج الإخراج التالي (لاحظ أن الدعوة إلى memcmp () يتم تحويلها إلى 8 بايت "repz cmpsb"):

   0:   55                      push   %ebp
   1:   b9 08 00 00 00          mov    $0x8,%ecx
   6:   89 e5                   mov    %esp,%ebp
   8:   fc                      cld    
   9:   83 ec 08                sub    $0x8,%esp
   c:   89 34 24                mov    %esi,(%esp)
   f:   8b 75 08                mov    0x8(%ebp),%esi
  12:   89 7c 24 04             mov    %edi,0x4(%esp)
  16:   8b 7d 0c                mov    0xc(%ebp),%edi
  19:   f3 a6                   repz cmpsb %es:(%edi),%ds:(%esi)
  1b:   0f 92 c0                setb   %al
  1e:   8b 34 24                mov    (%esp),%esi
  21:   8b 7c 24 04             mov    0x4(%esp),%edi
  25:   0f 97 c2                seta   %dl
  28:   89 ec                   mov    %ebp,%esp
  2a:   5d                      pop    %ebp
  2b:   28 c2                   sub    %al,%dl
  2d:   0f be c2                movsbl %dl,%eax
  30:   c3                      ret    
  31:   90                      nop    

نصائح أخرى

لاحظ أن روتين repz cmpsb قد لا يكون أسرع من memcmp الخاص بـ glibc.في اختباراتي، في الواقع، هو كذلك أبداً أسرع، حتى عند مقارنة بضع بايتات فقط.

يرى http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052

والآن في عام 2017، ويبدو أن دول مجلس التعاون الخليجي ورنة لبعض التحسينات لمخازن بمساحات 1 و 2 و 4 و 8 و البعض الآخر، على سبيل المثال 3 و 5 و 8 مضاعفات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top