সি ++ 20-র পরবর্তী সময়কালীন সিদ্ধান্তের ভিত্তিতে আলাদা আলাদা অন্তর্নিহিত বস্তু থাকতে পারে?


11

এই প্রশ্নটি সর্বশেষ C ++ 20 খসড়াটিতে P0593 যোগ করার বিষয়টি বোঝায় ।

এখানে আমার উদাহরণ:

#include <cstdlib>
#include <cstdio>

void foo(void *p)
{
    if ( std::getchar() == 'i' )
    {
        *(int *)p = 2;
        std::printf("%d\n", *(int *)p);
    }
    else
    {
        *(float *)p = 2;
        std::printf("%f\n", *(float *)p);
    }
}

int main()
{
    void *a = std::malloc( sizeof(int) + sizeof(float) );
    if ( !a ) return EXIT_FAILURE;

    foo(a);
    // foo(a);    [2]
}

এই কোডটি কি সর্বশেষ খসড়ার অধীনে সমস্ত ইনপুটগুলির জন্য ভাল সংজ্ঞাযুক্ত?

P0593-এ প্রকাশিত যুক্তিটি এটিকে মোটামুটি পরিষ্কার করে দিয়েছে যে [2]দু'জন ব্যবহারকারীর ইনপুট আইটেমগুলি পৃথক করে থাকলে, কঠোরভাবে আলিয়াস লঙ্ঘনের কারণে কোনও পরিস্থিতি অস্বীকার না করা আচরণের দিকে পরিচালিত করবে। অন্তর্নিহিত অবজেক্টের সৃষ্টি ঠিক একবারে ঘটবে বলে মনে করা হচ্ছে malloc; এটি অ্যাসাইনমেন্ট স্টেটমেন্ট দ্বারা ট্রিগার হয় না foo

প্রোগ্রামটির যে কোনও বাস্তব পরিচালনার জন্য, অন্তর্ভুক্ত অবজেক্টগুলির অনির্দিষ্ট সেটটির একটি সদস্য রয়েছেন যা প্রোগ্রামটিকে সু-সংজ্ঞায়িত করে তুলবে। তবে [ইন্ট্রো.ওজেক্ট] / 10-এ উল্লিখিত অন্তর্নিহিত অবজেক্ট তৈরির পছন্দটি অবশ্যই করা উচিত কিনা তা আমার কাছে স্পষ্ট নয় malloc; বা সিদ্ধান্তটি "সময় ভ্রমণ" করতে পারে কিনা।

একই প্রোগ্রামটি এমন একটি প্রোগ্রামের জন্য উত্থাপিত হতে পারে যা একটি বাইনারি ব্লবটি বাফারে পড়ে এবং তারপরে কীভাবে এটি অ্যাক্সেস করা যায় তার একটি রানটাইম সিদ্ধান্ত নেয় (উদাহরণস্বরূপ, ডেসারিয়ালাইজেশন; এবং শিরোনামটি জানিয়ে দেয় যে কোনও ফ্লোট বা কোনও আন্তঃসম্পর্ক আসছে কিনা)।

উত্তর:


9

অন্তর্নিহিত অবজেক্টের সৃষ্টি ঠিক একবারে ঘটবে বলে মনে করা হচ্ছে malloc; এটি অ্যাসাইনমেন্ট স্টেটমেন্ট দ্বারা ট্রিগার হয় না foo

এটি প্রাসঙ্গিক নয়। কোন বিষয়টি হ'ল কোন বস্তুটি তৈরি হয়। স্ট্যান্ডার্ডটি বলে যে বস্তুটি তৈরি হয় তা হ'ল যা এমন কিছু তৈরি করে যা ইউবি হতে পারে সংজ্ঞায়িত কোডে:

এই ক্রিয়াকলাপটি স্পষ্টতভাবে তার নির্দিষ্ট সঞ্চয়স্থানে শূন্য বা আরও বেশি অবজেক্ট-লাইফ-লাইফ টাইপ ([বেসিক.টাইপস]) এর অবজেক্টের জীবনকাল তৈরি করে এবং শুরু করে যদি এটি করা হয় তবে প্রোগ্রামটি সংজ্ঞায়িত আচরণের ফলে দেখা দেয়।

আচরণটি চূড়ান্তভাবে রানটাইম বাস্তবায়নের উপর ভিত্তি করে স্থির বিশ্লেষণ নয়। সুতরাং আপনার কেবলমাত্র প্রোগ্রামটির সম্পাদনা অনুসরণ করা দরকার যতক্ষণ না আপনি এমন কোনও মামলায় চালিত হন যেখানে আচরণ সংজ্ঞায়িত হবে না, তবুও সংজ্ঞায়িত হবে যদি কোনও প্রশ্নযুক্ত অপারেশন চলাকালীন সেই স্টোরেজে কোনও ধরণের কোনও অবজেক্ট তৈরি করা হয়েছিল।

সুতরাং সৃষ্টির অবস্থান সর্বদা "অপারেশন" হয় তবে কী তৈরি হয় তার সংকল্পটি রানটাইম (যেমন: আচরণ) এ কীভাবে স্মৃতি ব্যবহৃত হয় তার উপর ভিত্তি করে।


2
পরিষ্কার করে বলার জন্য, আপনি বলছেন যে আমার কোডটি ভাল সংজ্ঞায়িত হয়েছে?
এমএম

2
@ এমএম: এটি সঠিক।
নিকোল বলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.