alloca(3)

الاسم
alloca - تخصيص ذاكرة تُحرر آليًا

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <alloca.h>

void *alloca(size_t size);

الوصف
تخصص الدالة alloca() size بايت من المساحة في إطار المكدس للمستدعي. تُحرر هذه المساحة المؤقتة آليًا عندما تعود الدالة التي استدعت alloca() إلى مستدعيها.

قيمة الإرجاع
تُرجع الدالة alloca() مؤشرًا إلى بداية المساحة المخصصة. إذا تسبب التخصيص في تجاوز سعة المكدس، يكون سلوك البرنامج غير محدد.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
alloca() | سلامة الخيوط | MT-Safe

المعايير
لا شيء.

التاريخ
PWB, 32V.

ملاحظات
الدالة alloca() تعتمد على الآلة والمُصرّف. لأنها تخصص من المكدس، فهي أسرع من malloc(3) و free(3). في حالات معينة، يمكنها أيضًا تبسيط تحرير الذاكرة في التطبيقات التي تستخدم longjmp(3) أو siglongjmp(3). بخلاف ذلك، يُثبط استخدامها.

لأن المساحة المخصصة بواسطة alloca() تُخصص داخل إطار المكدس، تُحرر تلك المساحة آليًا إذا تم تجاوز عودة الدالة باستدعاء longjmp(3) أو siglongjmp(3).

المساحة المخصصة بواسطة alloca() لا تُحرر آليًا إذا خرج المؤشر الذي يشير إليها ببساطة عن النطاق؛ تُحرر آليًا عندما تعود الدالة المستدعية.

لا تحاول تحرير المساحة المخصصة بواسطة alloca() باستخدام free(3)!

بالضرورة، alloca() هي دالة مدمجة في المُصرّف، تُعرف أيضًا باسم __builtin_alloca(). مبدئيًا، تُترجم المُصرّفات الحديثة آليًا جميع استخدامات alloca() إلى الدالة المدمجة، لكن هذا محظور إذا طُلبت المطابقة للمعايير (-ansi, -std=c*)، وفي هذه الحالة يكون <alloca.h> مطلوبًا، خشية إصدار تبعية رمز.

حقيقة أن alloca() مدمجة تعني أنه من المستحيل أخذ عنوانها أو تغيير سلوكها بالربط مع مكتبة مختلفة.

المصفوفات متغيرة الطول (VLAs) هي جزء من معيار C99، اختيارية منذ C11، ويمكن استخدامها لغرض مماثل. لكنها لا تُنقل إلى C++ القياسي، وكونها متغيرات، تعيش في نطاق الكتلة الخاص بها وليس لها واجهة شبيهة بالمخصص، مما يجعلها غير مناسبة لتنفيذ وظائف مثل strdupa(3).

العلل
لا تستعلم alloca() من النظام عن ذاكرة المكدس المتاحة، ولا تعود لاستخدام الكومة إذا كان تخزين المكدس غير متاح. لذلك لا يمكنها الإشارة إلى خطأ إذا فشل التخصيص. إذا فشل التخصيص، من المرجح أن يتلقى البرنامج إشارة SIGSEGV.

في العديد من الأنظمة، لا يمكن استخدام alloca() داخل قائمة وسائط استدعاء دالة، لأن مساحة المكدس المحجوزة بواسطة alloca() ستظهر على المكدس في منتصف المساحة لوسائط الدالة.

انظر أيضًا
brk(2), longjmp(3), malloc(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.