সি ++ 20 তে কেন স্টেডিয়াম: সাইজ () প্রবর্তিত হয়?


101

সি ++ ২০std::ssize() নিচের মত ফ্রি ফাংশনটি চালু করেছে :

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;

ক্লিপ সি সিstatic_cast এর size()সদস্য ফাংশনের রিটার্ন মানটিকে তার স্বাক্ষরিত অংশে রূপান্তর করতে একটি সম্ভাব্য বাস্তবায়ন ব্যবহার করে মনে হচ্ছে ।

যেহেতু size()সি এর সদস্য ফাংশন সর্বদা অ-নেতিবাচক মানগুলি ফেরত দেয়, তাই কেন কেউ এগুলিকে স্বাক্ষরযুক্ত ভেরিয়েবলগুলিতে সঞ্চয় করতে চান? যদি সত্যিই কেউ চায়, এটি সাধারণ বিষয় static_cast

std::ssize()সি ++ 20 এ কেন চালু হয়?


4
@ জারোড 42 এটি বাস্তবায়ন কি সংজ্ঞায়িতের পরিবর্তে সংজ্ঞাযুক্ত নয়? (স্বাক্ষরিত ওভারফ্লো অনির্ধারিত but তবে স্বাক্ষরিত রূপান্তরটি বাস্তবায়নের সংজ্ঞা দেওয়া হয়েছে)

9
কেবলমাত্র যদি তারা ssizeofঅপারেটরও যুক্ত করে ।
geza

4
এই কিছুটা সম্পর্কিত হতে পারে: stackoverflow.com/questions/30395205/...
Marco13

11
@ জনজেড.লি.আই.আর খুব অস্বাস্থ্যকর শোনার ঝুঁকিতে: আমি মনে করি যে পূর্ণসংখ্যার প্রকারের বিষয়ে সি ++ এর পুরো টাইপ সিস্টেমটি নষ্ট হয়ে গেছে। অবশ্যই, কেউ তর্ক করতে পারে যে কিছু quirks (যেমন কতগুলি বিট জেনে নেই char) সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং অন্তত কিছুটা উপশম হয়েছে (u)intX_t, তবে এটি এখনও সমান সূক্ষ্ম এবং সমালোচিত বাগগুলির অন্তহীন উত্স । এই জাতীয় জিনিসগুলি ssizeকেবল প্যাচগুলি এবং এটি সাধারণ "সেরা অনুশীলনের গাইডসমূহ" পর্যন্ত না ডুবে যতক্ষণ না লোকেরা (কঠোরভাবে অনুসরণ করতে পারে) কিছুক্ষণ সময় লাগবে (সম্ভবত "চিরকালের জন্য")।
মার্কো 13

6
@ Marco13: অন্যদিকে, সি / সি ++ টাইপ সিস্টেম (যেমন জাভার সংশোধন ধরনের সিস্টেমে ভিন্ন), সরাইয়া অনুমতি সি / সি ++ আর্কিটেকচারের যেখানে সবচেয়ে অন্যান্য ভাষায় অসন্তোষ প্রকাশ করা কাজ করার কোড থেকে, নেই অনুমতি উপযুক্ত প্রশিক্ষক কিছু গুরুত্বপূর্ণ পেতে একজন শিক্ষার্থীর মাথায় পাঠ যেমন, সমস্ত বিশ্ব 64 বিট নয়। এবং না, সমস্ত বিশ্ব 8 বিট অক্ষর ব্যবহার করে না। এটা সহজ মৃত এসব সঙ্গে মানিয়ে নিতে, এবং আপনার একটি ভাল ডেভেলপার করে তোলে, যদি শুধু প্রশিক্ষক এই শিক্ষা দেবে শুরু থেকেই । (এবং, ঠিক নিশ্চিত করার জন্য, আপনি কি জানেন যে (u)intX_tধরনের হয় ঐচ্ছিক , আপনি কি?)
DevSolar

উত্তর:


71

যুক্তিটি এই কাগজে বর্ণিত হয়েছে । একটি উদ্ধৃতি:

স্প্যানটি যখন সি ++ 17 এ গৃহীত হয়েছিল, তখন এটি একটি স্বাক্ষরযুক্ত পূর্ণসংখ্যাকে সূচক এবং আকার উভয় হিসাবে ব্যবহার করে। আংশিকভাবে এটি "-1" কে প্রেরণেল মান হিসাবে এমন ধরণের নির্দেশকে চিহ্নিত করার জন্য অনুমতি দেওয়া হয়েছিল যার আকার সঙ্কলনের সময় জানা ছিল না। তবে একটি এসটিএল ধারক থাকার যার আকার () ফাংশনটি একটি স্বাক্ষরিত মান ফিরিয়ে দেয় সমস্যাযুক্ত, তাই সমস্যাটি "সমাধান" করার জন্য P1089 চালু করা হয়েছিল। এটি সংখ্যাগরিষ্ঠ সমর্থন পেয়েছে, তবে sensকমত্যের জন্য 2-থেকে -1 মার্জিনের প্রয়োজন নেই।

এই কাগজ, পি 1227, অ-সদস্য std :: size এবং সদস্য ssize () ফাংশন যোগ করার প্রস্তাব ছিল। এগুলির অন্তর্ভুক্তি নির্দিষ্ট কোডটিকে আরও সহজবোধ্য করে তুলবে এবং আকারের গণনাগুলিতে অযাচিত স্বাক্ষরযুক্ত-নেস এড়াতে অনুমতি দেবে। ধারণাটি ছিল যে এসএসডি: সাইজ () এবং সদস্য ফাংশন উভয়ের মাধ্যমেই সমস্ত কন্টেইনারের জন্য যদি সাইজ () উপলব্ধ করা হয় তবে P1089 এর প্রতিরোধ ক্ষমতা হ্রাস পাবে।


31
for(int i = 0; i < container.ssize() - 1; ++i)উদাহরণস্বরূপ মোটামুটি আকর্ষক হয়
Caleth

7
@ জন আমার কাছে সত্যই মনে হয়েছে যে তারা স্ট্রিং :: এনপোসের মতো একই কাজ করতে পারে এবং একটি বিশেষ মান হিসাবে আকার_t (-1) ব্যবহার করতে পারে।
রুবেনভবি

15
@ জনজেড.লি এটি দীর্ঘদিন ধরে একটি ভুল হিসাবে বিবেচিত যা এসটিএল আকারের ধরণের স্বাক্ষরযুক্ত নয়। দুর্ভাগ্যক্রমে এখন এটির সংস্কার করতে দেরি হয়ে গেছে। একটি নিখরচায় ফাংশন সরবরাহ করা এখনকার মতো সেরা কাজ।
এলএফ

16
@ এলএফ: এটি একটি সম্মেলনে হার্ব সটার ছিল (সম্ভবত বর্জন এটিও বলেছেন) তবে, সে কিছুটা ভুল। এখন, 32-বিট / 64-বিট কম্পিউটারের সাথে, স্বাক্ষরযুক্ত আকারটি আরও ভাল হবে (সুতরাং তিনি ঠিক বলেছেন)। তবে পুরানো দিনগুলিতে (16-বিট মাপ) স্বাক্ষরিত আকারটি খারাপ হত (উদাহরণস্বরূপ, আমরা কেবল 32k বাইট অ্যারে বরাদ্দ করতে পারতাম)।
geza

11
@ এলএফ: আমি হার্বের উল্লেখ এটি পেয়েছি: youtube.com/watch?v=Puio5dly9N8&t=2667 । যখন তিনি বলেন যে "খুব বেশি অনুশীলনে উঠে আসে না", আজকাল এটি সত্য। তবে এটি সত্য নয়> 20 বছর আগে (16-বিট সিস্টেম) মোটেও নয়। সুতরাং, এসটিএল ডিজাইন করার সময়, স্বাক্ষরবিহীন ব্যবহার করা এতটা ভুল ছিল না।
geza

51

অযৌক্তিকভাবে চুরি এরিক Niebler থেকে:

'Unsigned types signal that a negative index/size is not sane'যখন এসটিএলটি প্রথম ডিজাইন করা হয়েছিল তখন ছিল প্রচলিত জ্ঞান। কিন্তু যৌক্তিকভাবে, জিনিসগুলির একটি গণনা ইতিবাচক হওয়ার দরকার নেই। সংগ্রহ থেকে যুক্ত বা সরানো উপাদানগুলির সংখ্যা বোঝাতে আমি একটি স্বাক্ষরিত পূর্ণসংখ্যায় একটি গণনা রাখতে চাই। তারপরে আমি সংগ্রহের আকারের সাথে এটি একত্রিত করতে চাই। যদি সংগ্রহের আকারটি স্বাক্ষরযুক্ত না হয় তবে এখন আমি স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন গাণিতিকগুলি মিশ্রিত করতে বাধ্য হচ্ছি যা একটি বাগ খামার। সংকলকগণ এ সম্পর্কে সতর্ক করে, কিন্তু এসটিএল এর নকশা প্রোগ্রামারদেরকে এই পরিস্থিতিতে জোর করে, এই সতর্কতাটি এত সাধারণ যে বেশিরভাগ লোক এটিকে বন্ধ করে দেয়। এটি লজ্জাজনক কারণ এটি বাস্তব বাগগুলি লুকায়।

ইন্টারফেসে স্বাক্ষরবিহীন ints এর ব্যবহার অনেকের মনে হয় এটি হ'ল না। যদি দুর্ঘটনাক্রমে কোনও ব্যবহারকারী এপিআইতে কিছুটা নেতিবাচক সংখ্যা পাস করে, তবে হঠাৎ এটি একটি বিশাল ধনাত্মক সংখ্যা হয়ে যায়। যদি এআইপিআই নম্বরটি স্বাক্ষরিত হিসাবে গ্রহণ করে থাকে, তবে এটি শূন্যের চেয়ে বেশি বা সমান বলে জোর দিয়ে পরিস্থিতি সনাক্ত করতে পারে।

যদি আমরা স্বাক্ষরবিহীন ইনটগুলির ব্যবহারকে বিট বিস্কুট করার জন্য (যেমন, মাস্কগুলি) সীমাবদ্ধ করে এবং অন্য যে কোনও জায়গায় সাইন ইনট ব্যবহার করি, তবে বাগগুলি হওয়ার সম্ভাবনা কম থাকে এবং কখন ঘটে তা সনাক্ত করা সহজ।


6
সুইফট এই পদ্ধতিটি গ্রহণ করে, যদিও এটিতে নেতিবাচক স্বাক্ষরযুক্ত সংখ্যাগুলি বৃহত্তর স্বাক্ষরবিহীন সংখ্যা হিসাবে পুনরায় ব্যাখ্যা করা নিয়ে উদ্বেগ না থাকে (যেহেতু কোনও অন্তর্নিহিত কাস্ত নেই, যা আপনাকে সত্যিকার অর্থে এই উন্মাদ মজার ঘরে প্রবেশ করতে পারে)। তারা কেবল এ পদ্ধতিটি গ্রহণ করে (মেশিনের শব্দ আকারের) Intপুরো মুদ্রার সাধারণ মুদ্রার ধরণের হওয়া উচিত, এমনকি যেখানে ইতিবাচক সংখ্যাগুলিও বোঝায় (যেমন অ্যারের সূচিকরণ হিসাবে)। এ থেকে যে কোনও বিচ্যুতি সুপ্রতিষ্ঠিত হওয়া উচিত। সর্বত্র কাস্ট সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই এটি চমৎকার।
আলেকজান্ডার - মনিকা

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