আমি বিশ্বাস করি যে সমস্যাটি হ'ল আপনার অ্যারে স্ট্যাকের উপরে রয়েছে এবং আপনার সংকলক ওভার-অ্যালাইন্টেড স্ট্যাক ভেরিয়েবলগুলি সমর্থন করার জন্য খুব পুরানো। GCC 4.6 এবং পরে এই বাগটি ঠিক করেছে ।
C11 / C ++ 11 alignas(64) float a[4];
কেবল 2 প্রান্তিককরণের যে কোনও পাওয়ারের জন্য কাজ করে। আপনি এটি ব্যবহার করছেন ঠিক
তেমনই জিএনইউ সিও __attribute__((aligned(x)))
করে।
(সি 11 এ, এর #include <stdalign.h>
জন্য #define alignas _Alignas
: সিপিপিআরএফ )।
তবে আপনার একটি খুব বড় সারিবদ্ধকরণের ক্ষেত্রে, 4k পৃষ্ঠার সীমানায়, আপনি স্ট্যাকের মধ্যে এটি নাও চাইতে পারেন।
ফাংশন শুরু হওয়ার সাথে সাথে স্ট্যাক পয়েন্টারটি যে কোনও কিছু হতে পারে, আপনার প্রয়োজনের চেয়ে অনেক বেশি বরাদ্দ না করে এবং এডজাস্ট না করে অ্যারে সারিবদ্ধ করার কোনও উপায় নেই। ( and rsp, -4096
সংকলকগণ বরাদ্দকৃত 0 থেকে 4088 বাইটগুলির মধ্যে কোনওটিই সমতুল্য এবং ব্যবহার করবেন না; সেই স্থানটি যথেষ্ট পরিমাণে বড় কিনা তা শাখা করা সম্ভব হবে তবে সম্পন্ন হয়নি কারণ অ্যারের বা অন্য স্থানীয়দের আকারের চেয়ে বিশাল প্রান্তিককরণ খুব বড় হবে) সাধারণ ঘটনা নয়।)
আপনি যদি অ্যারেরটিকে ফাংশন থেকে বাইরে নিয়ে এবং একটি বৈশ্বিক পরিবর্তনশীল হিসাবে নিয়ে যান তবে এটি কাজ করা উচিত। আপনি যা করতে পারেন তা হ'ল এটি স্থানীয় ভেরিয়েবল হিসাবে রাখা (যা খুব ভাল জিনিস), তবে এটি তৈরি করুন static
। এটি স্ট্যাকের মধ্যে সংরক্ষণ হতে বাধা দেবে। সাবধান থাকুন যে এই দুটি উপায়ই থ্রেড-সেফ বা পুনরাবৃত্তি-নিরাপদ নয়, কারণ অ্যারের কেবলমাত্র একটি অনুলিপি থাকবে।
এই কোড সহ:
#include <stdio.h>
float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0};
int
main(void)
{
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
}
বুঝতে পেরেছি:
0x804c000 0x804c004 0x804c008 0x804c00c
যা প্রত্যাশা করা হয় আপনার আসল কোডটি সহ, আমি আপনার মতো এলোমেলো মানগুলি পাই।