سؤال
وفق مستندات مجلس التعاون الخليجي, ، 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.في اختباراتي، في الواقع، هو كذلك أبداً أسرع، حتى عند مقارنة بضع بايتات فقط.
والآن في عام 2017، ويبدو أن دول مجلس التعاون الخليجي ورنة لبعض التحسينات لمخازن بمساحات 1 و 2 و 4 و 8 و البعض الآخر، على سبيل المثال 3 و 5 و 8 مضاعفات.