خلط تأثيرات Println وFmt.Println على نمو المكدس
في Go، يعتمد تخصيص ونمو المكدس على استخدام الوظائف مثل println() و fmt.Println().
Println() vs. Fmt.Println()
Println() هي وظيفة مضمنة معروفة للمترجم، مما يعني أن الوسائط الخاصة بها لن تهرب إلى الكومة. في المقابل، fmt.Println()، الذي ينتمي إلى المكتبة القياسية، يتم التعامل معه كأي دالة معرفة من قبل المستخدم. لا يستطيع المترجم ضمان عدم هروب الوسائط الخاصة به، لذلك يتم تخصيص هذه الوسائط على الكومة بدلاً من المكدس. خارج المساحة، يتم تخصيص مكدس أكبر. وبالتالي، يتم نقل المتغيرات المخصصة للمكدس، وتغيير عناوينها. تحدث هذه الحركة بسبب تمرير الدالة العودية stackCopy() إلى وسيطة مهمة (مصفوفة بحجم 1024). المكدس الأولي المخصص غير كافٍ، مما يستلزم مكدسًا أكبر وإعادة تحديد موقع المتغيرات.
عند استخدام fmt.Println()، يتعرف المترجم على احتمال هروب الوسيطة ويخصصها على الكومة. ونتيجة لذلك، لا يؤدي نمو المكدس إلى تحفيز حركة s.
تحليل الهروبلفهم هذا السلوك بشكل أكبر، يمكن للمرء الاستفادة من "-gcflags '-m'" العلامات أثناء التجميع، والتي تكشف عن تحليل هروب المترجم. في حالة استخدام println() فقط، يكشف التحليل أن s لا يفلت. على العكس من ذلك، عند خلط println() وfmt.Println()، يستنتج المترجم أنه يتم الهروب ويخصصه على الكومة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3