সাইজ_টি এর সংজ্ঞা আমি কোথায় পাই?


123

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


সঠিক প্রশ্ন: stackoverflow.com/questions/502856/...
kjfletch

@ কেজেফ্লেচ: এইচএইচএমএমএম, এটি অদ্ভুত যে 'সাইজ_টি' শব্দটির জন্য অনুসন্ধান করা (যেমনটি আমি আগে করেছি) সেই প্রশ্নটি ফেরেনি।
এলিসিও ওকাম্পোস

1
@ এলিসিও - স্ট্যাকওভারফ্লোয়ের অনুসন্ধান কার্যটি ভয়াবহ। পরিবর্তে একটি 'সাইট: stackoverflow.com' পরামিতি সহ গুগল ব্যবহার করুন।
মাইকেল বুড়

8
ওপি বিশেষত জিজ্ঞাসা করেছে আমি আকার_ টি এর সংজ্ঞা কোথায় পাই? আমি এখানে একই জিনিস খুঁজছি। উদ্ধৃত ডুপটি কোথায় ঘোষণাটি সন্ধান করবে তা আলোচনা করে না।
jww

9
এই প্রশ্নটি স্পষ্টতই লিঙ্কযুক্ত হিসাবে একই প্রশ্ন নয়। "আমি কোথায় কিছু খুঁজে পাব" " " এর মধ্যে পার্থক্য কী " এই একই জিনিস নয় (এমনকি যদি একটির উত্তর অন্যটির উত্তর সরবরাহ করে)। 'C ++ যেখানে size_t সংজ্ঞা নেই' এর জন্য আমার Google অনুসন্ধান আমাকে সোজা এখানে নেন, এবং আমি অন্য প্রশ্ন মিস হতো, কারণ এটা বিভিন্ন
ড্যান নিসেনবাউম

উত্তর:


122

উইকিপিডিয়া থেকে

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

প্রকৃত ধরণ size_tহ'ল প্ল্যাটফর্ম নির্ভর; একটি সাধারণ ভুল অনুমান করা হয় size_tস্বাক্ষরবিহীন int- এ, যা প্রোগ্রামিং ত্রুটি হতে পারে হিসাবে একই, 2 বিশেষ করে যেমন 64-বিট আর্কিটেকচারের আরো প্রচলিত হয়ে পড়ে।

থেকে C99 7.17.1 / 2

নিম্নলিখিত শিরোনামগুলিতে ম্যাক্রোগুলি সংজ্ঞায়িত করা হয়েছে stddef.h

<স্নিপ>

size_t

যা আকারের অপারেটরের ফলাফলের স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার


2
উদাহরণস্বরূপ, উইন 64 এ , intএবং unsigned intপ্রকারগুলি 32 বিট হয়, যখন আকার_t হয় 64 বিট।
মাইকেল বুড়

7
দয়া করে আইএসও সি (99) স্ট্যান্ডার্ডের (যা থেকে সি ++ স্ট্যান্ডার্ড অন্তর্ভুক্ত) বিভাগ 7.17 এবং 7.18.3 দেখুন
মার্টিন ইয়র্ক

3
@ লকিআস্টারি কেন আপনি উত্তরটি সম্পাদনা করেন না কেন যেহেতু আপনি জানেন যে এটি স্ট্যান্ডার্ডে কোথায় লেখা হয়েছে?
হাই-এঞ্জেল

তাহলে সি ++ উত্তর কোথায়?
লোথার

@ লোথার আমি মনে করি একমাত্র পার্থক্য হ'ল আকার_ একটি মূলশব্দ হতে পারে এবং অন্যথায় এর একই অর্থ হয়।
পল স্টেলিয়ান

30

আকারের অনুসারে en.cppreferences.com এ বর্ণনাটিsize_t নিম্নলিখিত শিরোনামগুলিতে সংজ্ঞায়িত করা হয়েছে:

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>

2
আমার ঠিক এটির দরকার ছিল, এই উত্তরটি উঁচু করে দেওয়া উচিত।
নিওডেলফি

27

size_t আকারের অপারেটরের ফলাফলের স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণ (আইএসও C99 বিভাগ 7.17))

sizeofঅপারেটর তার প্রতীক এর আকার (বাইটে), যা একটি অভিব্যক্তি বা ধরনের আলাদা নাম হতে পারে উৎপাদ। আকারটি অপারেন্ডের ধরণ থেকে নির্ধারিত হয়। ফলাফল একটি পূর্ণসংখ্যা হয়। ফলাফলটির মান বাস্তবায়ন-ডিএনড হয় এবং এর ধরণ (স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার) হ'ল size_t(আইএসও C99 বিভাগ 6.5.3.4))


মানটির উদ্ধৃতি হিসাবে সেরা উত্তর।
মার্টিন ইয়র্ক

1
@ মার্টিন - যথেষ্ট সত্য, তবে আমি মনে করি যে প্রশ্নটির 'স্বাক্ষরিত স্বাক্ষর নেই কেন' অংশটি 'সাইজ_টি কি' অংশ হিসাবে আকর্ষণীয় (বা আরও), এবং আপনি এটি স্ট্যান্ডার্ডে পাবেন না ।
মাইকেল বুড়

হ্যাঁ, কোনও 'বিভাগ 17.17 ' ব্যতীত: পি। এটি বিরল, ভয়েড_টি সম্পর্কে কেউ কোনও কথা বলেনি
এলিসিও ওকাম্পোস

আমি এই উত্তরটি সরাসরি প্রশ্নের প্রতিক্রিয়া হিসাবে গ্রহণ করি, তবে এটি মাইকের উত্তরের সাথে প্রশংসিত হলে দুর্দান্ত হবে।
এলিজিও ওকাম্পোস

58
আপনার উত্তরটির জন্য করুণা অনুগ্রহ করে আমাকে কোন হেডার ফাইল অন্তর্ভুক্ত করতে হবে তা বলে না।
ম্যাট

6

ব্যবহারিকভাবে বলতে গেলে size_tআপনি যে বাইটগুলি সম্বোধন করতে পারবেন তার প্রতিনিধিত্ব করে। গত 10-15 বছর ধরে বেশিরভাগ আধুনিক স্থাপত্যগুলিতে 32 টি বিট হয়েছে যা স্বাক্ষরবিহীন কোনও আকারের আকারও রয়েছে। তবে আমরা bit৪ বিট uintঠিকানায় চলে যাচ্ছি যখন ইচ্ছেটি সম্ভবত 32 বাইটে থাকবে (এটির আকারটি সি ++ স্ট্যান্ডার্ডে নিশ্চিত নয়)। আপনার কোডটি তৈরি করতে যা আর্কিটেকচার জুড়ে মেমরির আকারের পোর্টেবলের উপর নির্ভর করে আপনার একটি ব্যবহার করা উচিত size_t। উদাহরণস্বরূপ অ্যারের আকারের মতো জিনিসগুলির সর্বদা ব্যবহার করা উচিত size_t। আপনি যদি স্ট্যান্ডার্ড পাত্রে দেখেন তবে ::size()সর্বদা একটি প্রদান করে size_t

এছাড়াও নোট করুন, ভিজ্যুয়াল স্টুডিওতে একটি সংকলন বিকল্প রয়েছে যা "64-বিট পোর্টিবিলিটি সমস্যাগুলি সনাক্ত করুন" নামক এই জাতীয় ত্রুটিগুলি পরীক্ষা করতে পারে।


2

এই উপায়টি আপনি সর্বদা জানেন যে আকারটি কী, কারণ একটি নির্দিষ্ট ধরণ মাপের জন্য উত্সর্গীকৃত। খুব নিজস্ব প্রশ্ন দেখায় যে এটি একটি সমস্যা হতে পারে: এটি একটি intবা একটি unsigned int? এছাড়াও, মাত্রার কি ( short, int, long, ইত্যাদি)?

একটি নির্দিষ্ট ধরণের নিয়োগ করা হয়েছে বলে আপনাকে দৈর্ঘ্য বা স্বাক্ষরিত নেসটি নিয়ে চিন্তা করতে হবে না।

আসল সংজ্ঞাটি সি ++ রেফারেন্স লাইব্রেরিতে পাওয়া যাবে , যা বলে:

প্রকার: size_t(স্বাক্ষরযুক্ত অবিচ্ছেদ্য প্রকার)

শিরোলেখ: <cstring>

size_tভাষা অপারেটর দ্বারা ফিরিয়ে দেওয়া ইন্টিগ্রাল ডেটা টাইপের সাথে মিলে যায় এবং এটিতে sizeofসংজ্ঞায়িত হয়<cstring> শিরোনামহীন ইন্টিগ্রাল টাইপ হিসাবে শিরোনাম ফাইলে (অন্যদের মধ্যে) ।

ইন <cstring>, এটা পরামিতি ধরণ হিসেবে ব্যবহার করা হয় numফাংশন memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpyএবং strxfrm, সব ক্ষেত্রেই এটা বাইট বা অক্ষরের ফাংশন প্রভাবিত হয়েছে সর্বোচ্চ সংখ্যক নির্দিষ্ট করতে ব্যবহৃত হয়।

এছাড়া রিটার্ন টাইপ জন্য হিসাবে ব্যবহার করা হয় strcspn, strlen, strspnএবং strxfrmরিটার্ন মাপ এবং লেন্থ করতে।


2

আকার_t আপনার স্ট্যান্ডার্ড লাইব্রেরির শিরোনামগুলিতে সংজ্ঞায়িত করা উচিত। আমার অভিজ্ঞতা হিসাবে, এটি সাধারণত স্বাক্ষরবিহীন ইনট্রে টাইপডেফ। কথাটি যদিও এটি হ'ল না। আকার_t এর প্রকারগুলি স্ট্যান্ডার্ড গ্রন্থাগার বিক্রেতাকে প্ল্যাটফর্মের জন্য উপযুক্ত হলে তার অন্তর্নিহিত ডেটা প্রকারগুলি পরিবর্তন করার স্বাধীনতা দেয়। যদি আপনি ধরে নেন যে সাইজ_টি সর্বদা স্বাক্ষরযুক্ত না থাকে (কাস্টিং ইত্যাদির মাধ্যমে), আপনি যদি ভবিষ্যতে সমস্যার সমাধান করতে পারেন তবে আপনার বিক্রেতা যদি সাইজ_টাকে 64৪-বিট টাইপের রূপে পরিবর্তন করে। এই কারণে এই বা অন্য কোনও গ্রন্থাগারের ধরণের সম্পর্কে কিছু ধারণা নেওয়া বিপজ্জনক।


1

void_tগুগল অনুসন্ধানের ফলাফল ছাড়া আমি এর সাথে পরিচিত নই (এটি এটিএন্ডটি রিসার্চে কিম-ফোং ভোর একটি লাইব্রেরিতে ব্যবহৃত হয়েছে)vmalloc - আমি নিশ্চিত যে এটি অন্যান্য লাইব্রেরিতেও ব্যবহৃত হয়েছে)।

বিভিন্ন এক্সএক্সএক্সএক্স_টি টাইপডিফগুলি নির্দিষ্ট নির্দিষ্ট প্রয়োগ থেকে কোনও প্রকারের বিমূর্ত ব্যবহার করতে ব্যবহৃত হয়, যেহেতু নির্দিষ্ট জিনিসের জন্য ব্যবহৃত কংক্রিটের ধরণগুলি এক প্ল্যাটফর্ম থেকে অন্য প্ল্যাটফর্মের মধ্যে পৃথক হতে পারে। উদাহরণ স্বরূপ:

  • সাইজ_টি বস্তুর আকার ধরে রাখতে ব্যবহৃত টাইপটিকে বিমূর্ত করে কারণ কিছু সিস্টেমে এটি 32-বিট মান হবে, অন্যদের কাছে এটি 16-বিট বা -৪-বিট হতে পারে।
  • Void_tvmallocলাইব্রেরির রুটিনগুলি দ্বারা ফিরিয়ে দেওয়া পয়েন্টার প্রকারের বিমূর্ততা এনে দেয় কারণ এটি এমন সিস্টেমে কাজ করার জন্য লেখা হয়েছিল যা প্রাক-তারিখের এএনএসআই / আইএসএস সি যেখানে শব্দটির voidঅস্তিত্ব থাকতে পারে। কমপক্ষে এটাই আমি অনুমান করতাম।
  • wchar_t বিস্তৃত অক্ষরের জন্য ব্যবহৃত টাইপটিকে বিমূর্ত করে তোলে কারণ কিছু সিস্টেমে এটি একটি 16 বিট টাইপ হবে, অন্যদের কাছে এটি 32 বিট টাইপ হবে।

সুতরাং আপনি যদি wchar_tপ্রকারের পরিবর্তে প্রকারটি ব্যবহার করতে আপনার প্রশস্ত চরিত্রের হ্যান্ডলিং কোডটি লিখেন , বলুন unsigned short, এই কোডটি সম্ভবত বিভিন্ন প্ল্যাটফর্মগুলিতে আরও বহনযোগ্য হবে।


এটি আমি আংশিকভাবে খুঁজছিলাম। আমি যেমন এফএমপিউরফির উত্তরে একটি মন্তব্যে বলেছি, এটি দুর্দান্ত যে এই উত্তরটির সাথে পরিপূরক হতে পারে (যদি আপনি কিছু মনে করেন না তবে আপনি এটি সম্পাদনা করতে পারেন) :)
এলিসিও ওকাম্পোস

1

সংক্ষিপ্ত প্রোগ্রামগুলিতে যেখানে কোনও size_tসংজ্ঞায় "সুযোগক্রমে" লোড করা হয়নি তবে কিছু কিছুতে আমার এখনও এটি প্রয়োজন (উদাহরণস্বরূপ অ্যাক্সেস করার জন্য std::vector<double>), তারপরে আমি সঠিক প্রকারটি বের করতে সেই প্রসঙ্গটি ব্যবহার করি । উদাহরণ স্বরূপtypedef std::vector<double>::size_type size_t

( namespace {...}স্কোপটি সীমাবদ্ধ করার জন্য যদি প্রয়োজন হয় তবে চারপাশে ))


1

"কেন ইন্ট বা স্বাক্ষরবিহীন ইন্ট ব্যবহার করবেন না?", কেবল কারণ এটি অর্থহীনভাবে আরও অর্থবহ নয়। এর বাস্তব কারণ আছে যা বলা যায়, typedefএকটি হিসাবে intএবং তারপরে পরে উন্নীত হতে পারে long, কাউকে অবশ্যই তাদের কোড পরিবর্তন না করেই অবশ্যই করা যেতে পারে তবে মৌলিকভাবে এর চেয়ে বেশি যে কোনও ধরণের অর্থবোধক বলে মনে করা হয়। ব্যাপকতর সরলকরণের জন্য, টাইপের একটি পরিবর্তনশীল সময়ের আকার ধারণের জন্য size_tউপযুক্ত, যেমন আকারের জিনিসগুলি সমেত জন্য উপযুক্ত এবং ব্যবহার করা time_tহয়। এগুলি কীভাবে বাস্তবায়িত হয় তা কার্যকরভাবে প্রয়োগের কাজ হওয়া উচিত। কেবল সমস্ত কিছু কল করার সাথে তুলনা intকরে, এর মতো অর্থবহ টাইপনেমগুলি ব্যবহার করে আপনার প্রোগ্রামের অর্থ এবং অভিপ্রায় স্পষ্ট করতে সহায়তা করে, যেমন কোনও ধরণের সমৃদ্ধ সংখ্যক ধরণের সেট যেমন করে।

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