আমি Span<T>সম্ভব হলে হিপ বরাদ্দ এড়ানোর জন্য আমার লাইব্রেরিগুলিকে রিফ্যাক্টর করছি তবে আমি পুরানো ফ্রেমওয়ার্কগুলিকেও টার্গেট হিসাবে আমি কিছু সাধারণ ফ্যালব্যাক সমাধানগুলিও বাস্তবায়ন করছি। তবে এখন আমি একটি অদ্ভুত সমস্যা পেয়েছি এবং। নেট কোর 3 এ আমি কোনও বাগ খুঁজে পেয়েছি বা আমি কোনও অবৈধ কাজ করছি কিনা তা সম্পর্কে আমি নিশ্চিত নই।
সমস্যাটি:
// This returns 1 as expected but cannot be used in older frameworks:
private static uint ReinterpretNew()
{
Span<byte> bytes = stackalloc byte[4];
bytes[0] = 1; // FillBytes(bytes);
// returning bytes as uint:
return Unsafe.As<byte, uint>(ref bytes.GetPinnableReference());
}
// This returns garbage in .NET Core 3.0 with release build:
private static unsafe uint ReinterpretOld()
{
byte* bytes = stackalloc byte[4];
bytes[0] = 1; // FillBytes(bytes);
// returning bytes as uint:
return *(uint*)bytes;
}
আকর্ষণীয়ভাবে যথেষ্ট, ReinterpretOldনেট নেট ফ্রেমওয়ার্ক এবং নেট কোর ২.০ এ ভাল কাজ করে (যাতে আমি এর পরেও খুশি হতে পারি), তবুও এটি আমাকে কিছুটা বিরক্ত করে।
BTW। ReinterpretOldএকটি ছোট পরিবর্তন দ্বারা। নেট কোর 3.0 এও ঠিক করা যেতে পারে:
//return *(uint*)bytes;
uint* asUint = (uint*)bytes;
return *asUint;
আমার প্রশ্ন:
এটি কি কোনও বাগ বা ReinterpretOldপুরানো ফ্রেমওয়ার্কগুলিতে কেবল দুর্ঘটনাক্রমে কাজ করে এবং আমি কি তাদের জন্য এই ফিক্সটি প্রয়োগ করব?
মন্তব্য:
- ডিবাগ বিল্ড। নেট কোর 3.0 এও কাজ করে
- আমি আবেদন
[MethodImpl(MethodImplOptions.NoInlining)]করার চেষ্টা করেছিReinterpretOldকিন্তু এর কোনও ফল হয়নি।
Span<T>বিভিন্ন আইএলকে সংকলন করে। আমি মনে করি না আপনি কিছু অবৈধ করছেন: আমি একটি জেআইটি বাগ সন্দেহ করি।
stackalloc(যেমন এটি বরাদ্দকৃত জায়গাটি মুছে দেয় না)
return Unsafe.As<byte, uint>(ref bytes[0]);বাreturn MemoryMarshal.Cast<byte, uint>(bytes)[0];- ব্যবহার করার প্রয়োজন নেইGetPinnableReference(); অন্য কিছুটা দেখুন, যদিও