সাইজ_টি এবং সি ++ এর মধ্যে পার্থক্য কী?


173

বেশ কয়েকটি সি ++ উদাহরণে আমি সেই ধরণের একটি ব্যবহার দেখতে পাই size_tযেখানে আমি একটি সাধারণ ব্যবহার করতাম int। পার্থক্য কী, এবং কেন size_tআরও ভাল হওয়া উচিত?


3
প্রকৃত উদাহরণের জন্য যেখানে তারা আদান
টাইলার ম্যাকহেনরি

উত্তর:


153

থেকে বন্ধুত্বপূর্ণ উইকিপিডিয়া :

Stdlib.h এবং stddef.h হেডার ফাইল ডাটাটাইপ নামক সংজ্ঞায়িত size_t যা একটি বস্তুর আকার প্রতিনিধিত্ব করতে ব্যবহৃত হয়। আকার ধারণ করে এমন লাইব্রেরির ফাংশনগুলি তাদের আকার_ tt টাইপ হওয়ার প্রত্যাশা করে এবং আকারের অপারেটর আকার_t এ মূল্যায়ন করে।

প্রকৃত ধরণের আকার_টি প্ল্যাটফর্ম-নির্ভর; একটি সাধারণ ভুল হ'ল আকার_t হ'ল স্বাক্ষরযুক্ত স্বাক্ষর হিসাবে একই, যা প্রোগ্রামিং ত্রুটির দিকে পরিচালিত করতে পারে, বিশেষত 64৪-বিট আর্কিটেকচার আরও প্রচলিত হয়ে ওঠে বলে।

এছাড়াও, কেন আকার_ত গুরুত্বপূর্ণ তা পরীক্ষা করে দেখুন


76
এবং সুতরাং, আকার_t কি?
এনডিডিথোস

8
@NDEthos এটি নির্ভর করে! এটির উপর এখানে লিনাক্স /usr/include/stdlib.hসংজ্ঞাটি পেয়েছে /usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.hএবং এর মধ্যে এটি ডিফল্ট হয় long unsigned intযদি না অন্য কোনও হেডার ফাইল অন্যথায় না বলে।
ডেভিড টোনহোফার

1
আমি নিশ্চিত করছি সাইজ_টি থেকে ইন টিউনেকশন বিপজ্জনক । এটি অফ-টপিকটি হতে পারে, তবে লিনাক্স কার্নেলের মধ্যে হাজার বার ঘটে গেলে এই জাতীয় ভুলগুলি ঠিক করতে একা প্যাচ কীভাবে লিখবেন?
ব্যবহারকারী 2284570

36

আকার_t হ'ল প্রকার যা আকারগুলির প্রতিনিধিত্ব করতে ব্যবহৃত হয় (যেমন এর নামগুলি বোঝায়)। এটির প্ল্যাটফর্ম (এবং এমনকি সম্ভাব্য বাস্তবায়ন) নির্ভর করে এবং কেবল এই উদ্দেশ্যে ব্যবহার করা উচিত। স্পষ্টতই, একটি আকার, আকার_t প্রতিনিধিত্ব স্বাক্ষরযুক্ত নয়। Malloc, আকার এবং বিভিন্ন স্ট্রিং অপারেশন ফাংশন সহ অনেক স্টডিলিব ফাংশন সাইজ_টাকে ডেটাটাইপ হিসাবে ব্যবহার করে।

কোনও পূর্বনির্ধারিত দ্বারা একটি স্বাক্ষরিত হয়, এবং এর আকারও প্ল্যাটফর্ম নির্ভর, যদিও এটি বেশিরভাগ আধুনিক মেশিনে একটি নির্দিষ্ট 32 বিট হবে (এবং যদিও আকার_টি 64৪-বিট আর্কিটেকচারে b৪ বিট হয় তবে those স্থাপত্যগুলিতে bits২ বিট দীর্ঘ থাকবে)।

সংক্ষিপ্তসার হিসাবে: কোনও ক্ষেত্রে কোনও অবজেক্টের আকার এবং ইন্ট (বা দীর্ঘ) এর আকার উপস্থাপন করতে আকার_ টি ব্যবহার করুন।


12

size_tধরনের স্বাক্ষরবিহীন অবিচ্ছেদ্য টাইপ হিসাবে সংজ্ঞায়িত করা হয় sizeofঅপারেটর। বাস্তব বিশ্বে আপনি প্রায়শই int32 বিট হিসাবে সংজ্ঞায়িত দেখতে পাবেন (পশ্চাদগম্য সামঞ্জস্যের জন্য) তবে size_t64 বিট হিসাবে সংজ্ঞায়িত (যাতে আপনি 4 বিবি প্ল্যাটফর্মের আকারে 4 GiB এর চেয়ে বেশি অ্যারে এবং কাঠামো ঘোষণা করতে পারেন)। যদি long intএকটিও -৪-বিট হয় তবে এটিকে LP64 কনভেনশন বলা হয়; যদি long int32 বিট হয় তবে long long intএবং পয়েন্টারগুলি 64 বিট হয়, এটি এলএলপি 64। আপনি বিপরীতটিও পেতে পারেন, এমন একটি প্রোগ্রাম যা গতির জন্য -৪-বিট নির্দেশিকা ব্যবহার করে, তবে মেমরি সংরক্ষণ করতে 32-বিট পয়েন্টার। এছাড়াও, intস্বাক্ষরিত এবং size_tস্বাক্ষরবিহীন।

Historতিহাসিকভাবে এমন অনেকগুলি প্ল্যাটফর্ম ছিল যেখানে ঠিকানাগুলি দেশীয় আকারের চেয়ে প্রশস্ত বা খাটো ছিল int। প্রকৃতপক্ষে, '70s এবং 80 এর দশকের প্রথমদিকে, এটি না হওয়ার চেয়ে বেশি সাধারণ ছিল: সমস্ত জনপ্রিয় 8-বিট মাইক্রো কম্পিউটারে 8-বিট রেজিস্টার এবং 16-বিট অ্যাড্রেস ছিল এবং 16 এবং 32 বিটের মধ্যে রূপান্তরও অনেকগুলি মেশিন তৈরি করেছিল যা তাদের রেজিস্টারগুলির চেয়ে আরও বিস্তৃত ঠিকানা ছিল। আমি মাঝে মাঝে এমএস-ডস-এর বোরল্যান্ড টার্বো সি সম্পর্কে প্রশ্নগুলি দেখতে পাই, যার বিশাল মেমরি মোডে একটি 16 বিট সিপিইউতে 32 বিটের মধ্যে 20-বিট ঠিকানা সঞ্চিত ছিল (তবে এটি 80386-এর 32-বিট নির্দেশিকা সেটকে সমর্থন করতে পারে); মোটোরোলা 68000-এ 32-বিট রেজিস্টার এবং ঠিকানা সহ 16-বিট ALU ছিল; 15-বিট, 24-বিট বা 31-বিট অ্যাড্রেস সহ আইবিএম মেইনফ্রেমগুলি ছিল। আপনি এম্বেড থাকা সিস্টেমে এখনও বিভিন্ন ALU এবং ঠিকানা-বাস মাপ দেখতে পাচ্ছেন।

যে কোনও সময় এর intচেয়ে ছোট হয় size_tএবং আপনি একটি খুব বড় ফাইল বা অবজেক্টের আকার বা অফসেট একটিতে সংরক্ষণ করার চেষ্টা unsigned intকরেন, সম্ভাবনা রয়েছে যে এটি উপচে পড়তে পারে এবং একটি বাগ তৈরি করতে পারে। একটি সঙ্গে int, aণাত্মক নম্বর পাওয়ার সম্ভাবনাও রয়েছে। যদি intবা আরও unsigned intবৃহত্তর হয় তবে প্রোগ্রামটি সঠিকভাবে চলবে তবে মেমরির অপচয় করবে।

আপনি বহনযোগ্যতা চাইলে আপনার প্রয়োজনটির জন্য সাধারণত সঠিক ধরণটি ব্যবহার করা উচিত। অনেক লোক আপনাকে স্বাক্ষরবিহীন পরিবর্তে স্বাক্ষরিত গণিত ব্যবহার করার পরামর্শ দেয় (ন্যাংটো, সূক্ষ্ম বাগগুলি পছন্দ করতে 1U < -3)। যে উদ্দেশ্যে, মানক গ্রন্থাগার সংজ্ঞায়িত ptrdiff_tমধ্যে <stddef.h>আরেকটি থেকে একটি পয়েন্টার বিয়োগ ফল স্বাক্ষরিত টাইপ হিসাবে।

তাই বলা হয়, বিরুদ্ধে সব ঠিকানা ও অফসেট সীমা চেক করার জন্য একটি কার্যসংক্রান্ত হতে পারে INT_MAXএবং হয় 0বা INT_MINযথাযথ হিসাবে, এবং কম্পাইলার এবং কেস সম্পর্কে স্বাক্ষরিত তুলনা সতর্কবার্তা স্বাক্ষরবিহীন পরিমাণে যদি আপনি কোন মিস্ চালু করুন। আপনার সর্বদা, সর্বদা, সর্বদা যাইহোক সি তে ওভারফ্লো করার জন্য আপনার অ্যারে অ্যাক্সেসগুলি চেক করা উচিত।


8

এর কারণ সাইজ_টি ইন্ট (সম্ভবত কোনও স্ট্রাক্ট) ব্যতীত অন্য কিছু হতে পারে। ধারণাটি হ'ল এটি অন্তর্নিহিত ধরণের থেকে এটির কাজটি ডিকপল করে।


8
আমি মনে করি সাইজ_টি আসলে একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য এলিয়াস হওয়ার গ্যারান্টিযুক্ত, সুতরাং এটি কোনও কাঠামো হতে পারে না। যদিও এই মুহুর্তে এটি ব্যাক আপ করার জন্য আমার কাছে কোনও রেফারেন্স কার্যকর নেই।
বিনোদন

9
@ ইউনুইন্ড: সি 99: টিসি 3, 7.17 §2
ক্রিস্টোফ

1
@ উদ্যানও কেন এমন হয়েছে? আপনি ব্যাখ্যা করতে পারবেন?
র‌্যাপেলের শকুন

2
আমি সিপিপ্লসপ্লাসের সাথে লিঙ্ক দিতাম না যদি আপনিই হন! আপনি যদি অধ্যায়, শ্লোক, অনুচ্ছেদ এবং রেখার উদ্ধৃতি দিতে না পারেন তবে তা সবই শ্রবণশক্তি! :-)
গ্রাহাম.রিডস

1
size_tস্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ হিসাবে নির্দিষ্ট করা হয় । C11 §6.5.3.4 5 "উভয় অপারেটরের ( sizeof _Alignof) এর ফলাফলের মান বাস্তবায়ন-সংজ্ঞায়িত এবং এর ধরণ (স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার) size_t,"।
chux -

-1

এর সংজ্ঞাটি SIZE_Tপাওয়া যায়: https://msdn.microsoft.com/en-us/library/cc441980.aspx এবং https://msdn.microsoft.com/en-us/library/cc230394.aspx

এখানে প্রয়োজনীয় তথ্য আটকানো:

SIZE_Tএটি একটি ULONG_PTRসর্বাধিক সংখ্যক বাইটের প্রতিনিধিত্ব করে যেখানে পয়েন্টারটি নির্দেশ করতে পারে।

এই ধরণের নিম্নলিখিত হিসাবে ঘোষণা করা হয়:

typedef ULONG_PTR SIZE_T;

ULONG_PTRহ'ল স্বাক্ষরযুক্ত দীর্ঘ প্রকার যা পয়েন্টার যথার্থতার জন্য ব্যবহৃত হয়। এটি পয়েন্টার পাটিগণিত সম্পাদন করার জন্য একটি দীর্ঘ টাইপে পয়েন্টার ingালাইয়ের সময় ব্যবহৃত হয়।

এই ধরণের নিম্নলিখিত হিসাবে ঘোষণা করা হয়:

typedef unsigned __int3264 ULONG_PTR;

2
SIZE_Tনা size_t, ওপি যা চেয়েছিল তা নয় ।
ইকগামি

2
এটি একটি মাইক্রোসফ্ট এক্সটেনশন, স্ট্যান্ডার্ড ভাষার অংশ নয়।
ডেভিস্লোর

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