সিতে কোনও ফাংশনের আকার সর্বদা 1 বাইট হয় কেন?


87

আমরা যখন কোনও ফাংশনের আকার ব্যবহার করে যাচাই করি sizeof(), আমরা সর্বদা 1 বাইট পাই । এই 1 বাইটটি কী বোঝায়?

উত্তর:


80

এটি একটি সীমাবদ্ধতা লঙ্ঘন এবং আপনার সংকলকটি এটি নির্ধারণ করা উচিত । যদি তা সত্ত্বেও এটি সংকলন করে, আপনার প্রোগ্রামটির ব্যর্থতা মোডের স্পষ্টকরণের জন্য @ স্টিভ জেসপকে ধন্যবাদ জানাতে হবে এবং কিছু সংকলক এটি কেন অনুমতি দেয় তার জন্য @ মিশেল বারার উত্তর দেখুন ]: সি 11, 6.5.3.4./ থেকে 1:

sizeofঅপারেটর একটি অভিব্যক্তি ফাংশন টাইপ আছে প্রয়োগ করা হইবে


11
এটি একটি সীমাবদ্ধতা, যার অর্থ এটি নির্ণয় করা সংযোজক সংকলকটির মধ্যে। যদি সংকলক যেকোন উপায়ে এটি সংকলন করে (এটি নির্ধারণ করে), তবে আচরণটি সংজ্ঞায়িত। যদি সংকলক এটি সনাক্ত করে না (উদাহরণস্বরূপ, জিসিসি ছাড়া এটি না -pedantic), আপনার একটি অ-সঙ্গতিপূর্ণ সংকলক রয়েছে এবং প্রতিটি প্রোগ্রামেরই অপরিবর্তিত আচরণ রয়েছে।
স্টিভ জেসোপ

4
আচরণ এটিকে GNU C এক্সটেনশান হিসাবে একই বিভাগে রাখে, তবে কেউ কেন এমন আচরণ চায় তা আমার কোনও ধারণা নেই , তাই GNU লেখকরা কেন এটি যুক্ত করার উপায় থেকে বেরিয়ে গেলেন তা আমি জানি না।
স্টিভ জেসোপ

4
@SteveJessop: লক্ষ্য করুন এই এমনকি সাথে আছেন -std=c11, না gnu11 । এটি একটি সত্যই অদ্ভুত সংকলক এক্সটেনশন।
কেরেক এসবি

6
ওহ! আমি বাজি ধরেছি এটি ফাংশন পয়েন্টারে গাণিতিক সক্ষম করতে পারে, একইভাবে sizeof(void)জিএনইউ সি-তে 1
স্টিভ জেসপ

4
সম্পর্কিত -std=c11: কারওরূপে -std=c*বিজ্ঞাপনের মানগুলিতে বিকল্পগুলি উল্লেখ করা উচিত । তারা কনফরমেশন মোড সক্ষম করে না, তারা কেবলমাত্র এমন এক্সটেনশনগুলি অক্ষম করে যা একটি সুগঠিত প্রোগ্রামকে সংকলন থেকে বিরত রাখে (যেমন typeofএকটি কীওয়ার্ড হওয়া, যেহেতু একটি সুগঠিত সি প্রোগ্রাম এটিকে চলক নাম হিসাবে ব্যবহার করতে পারে তবে gccডিফল্টরূপে এটি প্রত্যাখ্যান করবে) )। অতিরিক্ত নিষ্ক্রিয় এক্সটেনশনের অসুস্থ গঠিত প্রোগ্রাম undiagnosed পাস অনুমতি দিতে, আপনি প্রয়োজন -pedanticবা -pedantic-errors
স্টিভ জেসোপ

56

এটি অপরিবর্তিত আচরণ নয় - অপারেটরের sizeofজন্য সীমাবদ্ধতা লঙ্ঘন করার কারণে ফাংশন ডিজাইনার (একটি ফাংশন নাম) দিয়ে অপারেটরটি ব্যবহার করার সময় সি ভাষার মানটির ডায়াগনস্টিক প্রয়োজন sizeof

যাইহোক, সি ল্যাঙ্গুয়েজ একটি এক্সটেনশান হিসাবে, জিসিসি উপর গাণিতিক পারবেন voidপয়েন্টার এবং ফাংশন পয়েন্টার, যা একটি আকার চিকিত্সা দ্বারা সম্পন্ন করা হয় voidবা একটি ফাংশন 1। ফলস্বরূপ, sizeofঅপারেটর জিসিসি সহ কোনও ফাংশনের 1জন্য মূল্যায়ন করবে voidHttp://gcc.gnu.org/onlinesocs/gcc/Pointer-Arith.html# পয়েন্টার- অরিথ দেখুন

আপনি জিসিসির কাছে বিকল্পগুলি বা বিকল্পগুলি sizeofব্যবহার করে এই অপারেশনগুলির সাথে ব্যবহার করার সময় আপনি একটি সতর্কতা জারি করতে জিসিসি পেতে পারেন । অথবা এটি দিয়ে একটি ত্রুটি করুন ।-pedantic-Wpointer-arith-Werror=pointer-arith


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

4
সি সমস্ত বাধা লঙ্ঘনের জন্য ডায়গনিস্টিকের প্রয়োজন (5.1.1.3 ডায়াগনস্টিকস C99 বা সি 11 এ)। একটি প্রতিবন্ধকতা (সি 99 / সি 11-এ 3.8) হ'ল একটি "বাধা, উভয়ই সিন্টেক্সটিক বা শব্দার্থক, যার দ্বারা ভাষার উপাদানগুলির বিবরণ ব্যাখ্যা করা উচিত", যা বলে মনে হয় যে বাধাগুলি অনুসরণ করে না এমন কিছু ব্যাখ্যা করা যায় না ।
মাইকেল বুড় 9

4
এবং স্পষ্টত - একটি সীমাবদ্ধতা লঙ্ঘন অনির্ধারিত আচরণের ফলাফল দেয় না। এটি একটি ত্রুটি, সিনট্যাক্স ত্রুটির মতো। উদাহরণস্বরূপ, স্ট্যান্ডার্ডটি বলে, "যদি" বাধা "বা" আবশ্যক নয় "যে বাধ্যবাধকতার বাইরে দেখা যায় তা লঙ্ঘিত হয় তবে আচরণটি অপরিজ্ঞাত। যদি সীমাবদ্ধতা লঙ্ঘনের ফলে ইউবির ফলাফল হয়, তবে কেন এখানে "বাধা" এবং "নাট নোটস" সম্পর্কে সীমাবদ্ধ কথা বলা হবে না?
মাইকেল বুড়

4
আমি ইউবি সম্পর্কে সত্যিকার অর্থে খুব বেশি কিছু জানাতে পারি নি ব্যতীত sizeofকোনও ফাংশনটি ইউবি নয় (যা আমি বেশ উল্লেখ করেছি কেবলমাত্র অন্যান্য উত্তর বলেছিল এটি ইউবি ছিল)। তবে আমি বাক্যটি কাঠামোগত করার কারণেই সম্ভবত এটি বিড়বিড় করেছিলাম। আরও পরিষ্কার হতে হবে। sizeofকোনও ফাংশনটি ইউবি নয় (যেমন বেশ কয়েকটি উত্তর দাবি করেছে)। এটি একটি সীমাবদ্ধ লঙ্ঘন is যেমন, এটি একটি ডায়াগনস্টিক প্রয়োজন। জিসিসি এটিকে এক্সটেনশন হিসাবে অনুমতি দেয়।
মাইকেল বুড়

4
@ কেরেকএসবি: ওপি একটি ডায়াগনস্টিক পাবে না কারণ সম্ভবত তারা জিসিসি ব্যবহার করছে, এটি সি ভাষার সম্প্রসারণ হিসাবে এই ব্যবহারের অনুমতি দেয়।
মাইকেল বুড়

13

এটি ইঙ্গিত দেয় যে সংকলক লেখক আপনার নাক থেকে অসুরদের উড়ে না যাওয়ার পরিবর্তে 1 টির মান নিয়ে সিদ্ধান্ত নিয়েছেন (সত্যই, এটির আর একটি অপরিবর্তিত ব্যবহারই sizeofআমাদের এই অভিব্যক্তিটি দিয়েছিল: "সি সংকলক নিজেই একটি ডায়াগনস্টিক ইস্যু করতে হবে যদি এটি প্রথম প্রয়োজন তবে আপনার প্রোগ্রামের ফলে ডায়াগনস্টিক এবং তারপরে মায়েরা নিজেই আপনার নাক থেকে রাক্ষসকে উড়ে নিয়ে যায় (যা সিনট্যাক্সের বিধি বা বাধাগুলির আরও লঙ্ঘনের জন্য আরও ডায়াগনস্টিকস দিতে পারে) এই বিষয়ে, যে কোনও কারণে এটি চয়ন করে) "" https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

এটি থেকে এখানে অনির্ধারিত নির্মাণের প্রতিক্রিয়া হিসাবে কোনও সংকলক যা সিদ্ধান্ত নেয় তার জন্য "অনুনাসিক অসুর" শব্দটি রয়েছে। 1এই ক্ষেত্রে এই সংকলকের অনুনাসিক দৈত্য।


@ ইলমারি কারোনেন যদিও আমাকে স্বীকার করতেই হবে যে আমার বেশিরভাগ উত্তর সি (এবং সি ++) এর উত্তরগুলি সাধারণ ভাষা-অজ্ঞাত নীতিতে বা historicalতিহাসিক ন্যাগেটের উপর রয়েছে। আমার সি অভিজ্ঞতা নিজেই :) ঐতিহাসিক সীমানা হয়
জন হানা

7

অন্যরা যেমন উল্লেখ করেছে, মাপের () কোনও বৈধ শনাক্তকারী নিতে পারে তবে এটি ফাংশন নামের জন্য কোনও বৈধ (সত্যই সত্য এবং কার্যকর) ফলাফল দেয় না। তদ্ব্যতীত, এটি অবশ্যই "নাক থেকে শয়তান" সিনড্রোমের ফলাফল হতে পারে বা নাও পারে।

আপনি যদি নিজের প্রোগ্রামের ফাংশন আকারটি প্রোফাইল করতে চান তবে লিঙ্কার ম্যাপটি পরীক্ষা করুন, যা মধ্যবর্তী ফলাফল ডিরেক্টরিতে পাওয়া যেতে পারে (এটি যেখানে জিনিসগুলি .obj / .o তে সংকলিত হয় বা যেখানে ফলস্বরূপ চিত্র / নির্বাহযোগ্য স্তর থাকে)। কখনও কখনও এই মানচিত্র ফাইলটি উত্পন্ন বা না করার বিকল্প রয়েছে ... এটি সংকলক / লিঙ্কার নির্ভর।

যদি আপনি কোনও ফাংশনের পয়েন্টারের আকার চান তবে সেগুলি সমস্ত একই আকার, আপনার সিপুতে একটি ঠিকানা শব্দের আকার।


4
কি ধরণের বক্তব্য "এটি অবশ্যই পারে বা নাও পারে" ??? আক্ষরিক সব কি সত্য নয়?
কেরেক এসবি

@ কেরেকএসবি হ্যাঁ, তবে এখানে এটি কিছু করতে বা করতে পারে না, এবং এখনও নিয়মের মধ্যে থাকতে পারে। এটি সত্য যে কোনও সংকলক সংকলন করতে অস্বীকার করতে পারে বা নাও পারে int x = 1;তবে এর মধ্যে কেবলমাত্র একটি মান সম্মতিযুক্ত সংকলক জন্য অনুমোদিত। sizeof()কোনও ফাংশনে প্রয়োগ হওয়ার সাথে সাথে এটি কোনও নির্দিষ্ট মূল্য ফেরত দিতে পারে না, বা সংকলন করতে অস্বীকার করতে পারে, বা কোনও নির্দিষ্ট নিবন্ধের সময়ে যে কোনও রেকর্ডারে যা আছে তার ভিত্তিতে একটি এলোমেলো মান ফিরে আসতে পারে। আক্ষরিক অনুনাসিক অসুরগুলি অসম্ভব, তবে মানের অক্ষরের মধ্যে।
জন হান্না

@kerrek এটি কোনও কিছুর জন্য সত্য হতে পারে বা কোনও কিছুর জন্য মিথ্যাও নাও হতে পারে ... এটিকে অযৌক্তিক অযৌক্তিক বলে মনে হয়।
jpinto3912

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