ما هي بعض التقنيات للتعامل بأمان كلا 32bit و 64bit المؤشرات دون ماكرو الشرطية؟
-
20-09-2019 - |
سؤال
وأنا بتحديث بعض التعليمات البرمجية في مكتبة لأنني قد وجدت من قانون بلدي الأصلي يفترض 32BIT والمؤشرات. لدي thinkings بلدي حول كيفية إصلاح ذلك، ولكن للدقة، وأنا أريد أن أسأل ما هي بعض التقنيات التي ستستخدم لجعل هذا العمل رمز لكلا 32bit و 64bit بدون ماكرو؟
char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
وsizeof (معرف *) هو 4 على 32BIT و، 8 على 64BIT. أنا باستخدام شار * argList لبناء مجموعة من المؤشرات إلى الأشياء، ثم باستخدام طريقة getObjects NSArray ل:
[myNSArray getObjects:(id *)argList];
ويعمل في 32BIT و، تعطل في 64BIT (لأسباب واضحة)
المحلول
وعلى الرغم من أنني لم يكن لديك كل من السياق، وأظن أن هذا ليس حقا مشكلة 32/64 بت. ما ربما كنت أريده هو شيء على غرار:
id *argList = malloc(sizeof(id) * argumentsCount);
وتبعا للحالة، وأنا في بعض الأحيان مثل تخصيص كتل الذاكرة مثل هذا مع تخصيص zero'd بالفعل:
id *argList = calloc(1UL, sizeof(id) * argumentsCount);
وكلا هذين تخصيص جزء من الذاكرة قادرة على اجراء عدد argumentsCount
من المؤشرات إلى الكائنات. يمكنك الوصول إلى مؤشرات الفردية مثل ذلك:
argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);
وعندما تقوم بتعريف argList
كمؤشر إلى نوع char
، كما فعلت في المثال الخاص بك، فهرسة العناصر الفردية (أي argList[0]
، argList[1]
)، سيتم الوصول إلى البايتات الفردية من الذاكرة المخصصة argList
، لا مؤشرات الفردية كما كنت 'إعادة ربما تتوقع. عندما تقوم بتعريف argList
كما id
، كما فعلت في ما سبق، فهرسة عناصر الخطوات الفردية من خلال الذاكرة المخصصة argList
التي كتبها بايت sizeof(id)
. فإن المترجم تعويض تلقائيا لحجم المؤشر الصحيح لبنية الهدف.
وعلى افتراض أن المؤشر عاد من malloc()
هو 0x1000
، وهنا جدول العناوين التي ستحسب لوضع 32 و 64bit للإعلانات char *
وid *
:
32-bit: char * id * 64-bit: char * id *
argList[0]: 0x1000 0x1000 0x1000 0x1000
argList[1]: 0x1001 0x1004 0x1001 0x1008
وليس لدي أي فكرة عن سبب هذا العمل من أي وقت مضى بالنسبة لك في وضع 32 بت.
نصائح أخرى
لماذا حفظ هويات في مجموعة C بدلا من واحدة من الطبقات جمع المتاحة في المؤسسة؟