যতদূর আমি জানি, রেফারেন্স / পয়েন্টার আলিয়াসিং সংকলকটির অনুকূলিত কোড উত্পন্ন করার ক্ষমতা বাধাগ্রস্ত করতে পারে, যেহেতু অবশ্যই তাদের অবশ্যই জেনারেটেড বাইনারি ক্ষেত্রে সঠিকভাবে আচরণ করে যেখানে দুটি রেফারেন্স / পয়েন্টার প্রকৃতরূপে উপনাম রয়েছে ensure উদাহরণস্বরূপ, নিম্নলিখিত সি কোডে,
void adds(int *a, int *b) {
*a += *b;
*a += *b;
}
পতাকা clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
সহ যখন সংকলন করা হয় তখন -O3
তা নির্গত হয়
0000000000000000 <adds>:
0: 8b 07 mov (%rdi),%eax
2: 03 06 add (%rsi),%eax
4: 89 07 mov %eax,(%rdi) # The first time
6: 03 06 add (%rsi),%eax
8: 89 07 mov %eax,(%rdi) # The second time
a: c3 retq
এখানে কোড (%rdi)
দু'বার ক্ষেত্রে int *a
এবং int *b
উলামে ফিরে আসে ।
আমরা যখন স্পষ্টভাবে সংকলককে বলি যে এই দুটি পয়েন্টার মূল শব্দটির সাথে উপনাম করতে পারে না restrict
:
void adds(int * restrict a, int * restrict b) {
*a += *b;
*a += *b;
}
তারপরে ক্ল্যাং বাইনারি কোডের আরও অনুকূলিত সংস্করণ প্রস্থান করবে:
0000000000000000 <adds>:
0: 8b 06 mov (%rsi),%eax
2: 01 c0 add %eax,%eax
4: 01 07 add %eax,(%rdi)
6: c3 retq
যেহেতু মর্ট নিশ্চিত করেছে (অনিরাপদ কোড ব্যতীত) যে দুটি মিউটেবল রেফারেন্স উলেস করতে পারে না, তাই আমি মনে করি যে সংকলকটি কোডটির আরও অনুকূলিত সংস্করণ নির্গত করতে সক্ষম হবে।
যখন আমি নিচের কোড দিয়ে পরীক্ষা এবং সঙ্গে এটি কম্পাইল rustc 1.35.0
সঙ্গে -C opt-level=3 --emit obj
,
#![crate_type = "staticlib"]
#[no_mangle]
fn adds(a: &mut i32, b: &mut i32) {
*a += *b;
*a += *b;
}
এটি উত্পন্ন:
0000000000000000 <adds>:
0: 8b 07 mov (%rdi),%eax
2: 03 06 add (%rsi),%eax
4: 89 07 mov %eax,(%rdi)
6: 03 06 add (%rsi),%eax
8: 89 07 mov %eax,(%rdi)
a: c3 retq
এটি গ্যারান্টিটির সদ্ব্যবহার করে না a
এবং b
উপনাম করতে পারে না।
এটি কি কারণ বর্তমান মরিচা সংকলকটি এখনও বিকাশে রয়েছে এবং অপ্টিমাইজেশানটি করতে এখনও ওরফে বিশ্লেষণকে অন্তর্ভুক্ত করেনি?
এটি কি কারণ এখনও এমন একটি সম্ভাবনা রয়েছে যা নিরাপদ মরচেও থাকতে পারে a
এবং b
উরফ করতে পারে?
unsafe
কোডেও, পরিবর্তনশীল রেফারেন্স অনুমোদিত নয় এবং ফলস্বরূপ অপরিবর্তিত আচরণের ফলস্বরূপ। আপনার কাঁচা পয়েন্টারগুলি আলিয়াসিং থাকতে পারে তবে unsafe
কোডটি আসলে আপনাকে মরিচা স্ট্যান্ডার্ড বিধিগুলি উপেক্ষা করার অনুমতি দেয় না। এটি কেবল একটি সাধারণ ভ্রান্ত ধারণা এবং এইভাবে দেখানো মূল্যবান।
+=
শরীরের দুটি ক্রিয়াকলাপকে পুনরায় ব্যাখ্যা করা adds
যেতে পারে কিনা তা নিয়ে এটি ফুটে উঠেছে *a = *a + *b + *b
। পয়েন্টার ওরফে না, তাহলে তারা, আপনি এমনকি দেখতে পারেন কি পরিমাণ b* + *b
দ্বিতীয় তালিকা এ এস এম দেখুন: 2: 01 c0 add %eax,%eax
। তবে তারা যদি উপনামটি করেন তবে তারা পারবেন না, কারণ আপনি *b
দ্বিতীয়বার যুক্ত করার সময় এর মধ্যে প্রথমবারের চেয়ে আলাদা মান থাকবে (আপনি 4:
প্রথম asm তালিকার লাইনে যেটি সঞ্চয় করেন )।