কেন সি ++ প্রাথমিক বরাদ্দ সি এর তুলনায় এত বড়?


138

একই কোডটি ব্যবহার করার সময়, কেবলমাত্র সংকলক (একটি সি সংকলক থেকে একটি সি ++ সংকলক) পরিবর্তন করা কত মেমরি বরাদ্দ করা হবে তা পরিবর্তন করবে। আমি কেন নিশ্চিত তা নিশ্চিত নই এবং এটি আরও বুঝতে চাই। এখনও অবধি আমি যে উত্তম সাড়া পেয়েছি তা হ'ল "সম্ভবত আমি / হে স্ট্রিমস", যা খুব বর্ণনামূলক নয় এবং আমাকে সি ++ এর দিকটি "আপনি যা ব্যবহার করেন না তার জন্য অর্থ প্রদান করেন না" সম্পর্কে আমাকে অবাক করে দেয়।

আমি যথাক্রমে 7.0.1-8 এবং 8.3.0-6 সংস্করণগুলি ক্ল্যাং এবং জিসিসি সংকলকগুলি ব্যবহার করছি। আমার সিস্টেমটি সর্বশেষতম, দেবিয়ান 10 (বুস্টার) এ চলছে। মানদণ্ডগুলি Valgrind Massif এর মাধ্যমে সম্পন্ন হয়।

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

ব্যবহৃত কোডটি পরিবর্তিত হয় না, তবে আমি সি হিসাবে বা সি ++ হিসাবে সংকলন করি না কেন, এটি ভালগ্রাইন্ড বেঞ্চমার্কের ফলাফলগুলিকে পরিবর্তন করে। সংকলকগুলিতে মানগুলি অবশ্য সামঞ্জস্য থাকে। প্রোগ্রামের জন্য রানটাইম বরাদ্দ (শিখর) নিম্নলিখিত হিসাবে যান:

  • জিসিসি (সি): 1,032 বাইট (1 কেবি)
  • জি ++ (সি ++): 73,744 বাইট, (~ 74 কেবি)
  • ঝনঝন (সি): 1,032 বাইট (1 কেবি)
  • ঝাঁকুনি ++ (সি ++): 73,744 বাইট (KB 74 কেবি)

সংকলনের জন্য, আমি নিম্নলিখিত কমান্ডগুলি ব্যবহার করি:

clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp

ভালগ্রিন্ডের জন্য, আমি valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-langপ্রতিটি সংকলক এবং ভাষা চালাই , তারপরে ms_printশিখর প্রদর্শন করার জন্য।

আমি কি এখানে কিছু ভুল করছি?


11
প্রথমত, আপনি কীভাবে বিল্ডিং করছেন? আপনি কোন বিকল্পগুলি ব্যবহার করেন? এবং আপনি কিভাবে পরিমাপ করবেন? আপনি কীভাবে ভালগ্রাইন্ড চালাবেন?
কিছু প্রোগ্রামার

17
যদি আমি সঠিকভাবে মনে রাখি তবে আধুনিক সি ++ সংকলকগুলির একটি ব্যতিক্রম মডেল থাকতে হবে যেখানে tryবৃহত্তর মেমরির পদক্ষেপের ব্যয়ে কোনও ব্লকে প্রবেশ করার কোনও পারফরম্যান্স নেই , সম্ভবত কোনও জাম্প টেবিল বা অন্য কোনও কিছু দিয়ে। ব্যতিক্রম ব্যতীত সংকলন করার চেষ্টা করুন এবং দেখুন কি প্রভাব আছে তা দেখুন। সম্পাদনা: প্রকৃতপক্ষে, পুনরাবৃত্তভাবে বিভিন্ন সি ++ বৈশিষ্ট্যগুলি অক্ষম করে দেখুন মেমরির পদক্ষেপে কী প্রভাব ফেলে তা দেখতে see
ফ্রান্সোইস অ্যান্ডরিয়াকস

3
clang++ -xcপরিবর্তে সংকলন করার সময় clang, একই বরাদ্দটি সেখানে ছিল, যা লিঙ্কযুক্ত গ্রন্থাগারগুলির কারণে
জাস্টিন

14
@ বিগুইলিডোস এটি প্রকৃতপক্ষে সি ++, এটি সি ++ স্পেসিফিকেশনগুলির কোনও অংশই ভেঙে দেখতে পাচ্ছি না ... সম্ভাব্যভাবে সিটিডিওয়ের চেয়ে স্টিডিও সহ অন্তর্ভুক্ত তবে এটি কমপক্ষে পুরানো সি ++ সংস্করণে অনুমোদিত। আপনার মনে হয় এই প্রোগ্রামটিতে "বিকৃত" কি?
মান

4
আমি সন্দেহজনক বলে মনে করি যে সেইসব জিসিসি এবং ক্ল্যাং সংকলকগুলি Cমোডে ঠিক একই সংখ্যক বাইট এবং বাইটস মোডের ঠিক একই সংখ্যক উত্পন্ন করে C++। আপনি কি প্রতিলিপি ত্রুটি করেছেন?
রন জন

উত্তর:


149

গাদা ব্যবহার সি ++ স্ট্যান্ডার্ড লাইব্রেরি থেকে আসে। এটি স্টার্টআপে অভ্যন্তরীণ গ্রন্থাগার ব্যবহারের জন্য মেমরির বরাদ্দ করে। আপনি যদি এর বিপরীতে লিঙ্ক না করেন তবে সি এবং সি ++ সংস্করণের মধ্যে শূন্য পার্থক্য থাকা উচিত। জিসিসি এবং কলং এর সাহায্যে আপনি ফাইলটি সংকলন করতে পারেন:

g ++ -Wl, - যেমন প্রয়োজন মেইন সিপিপি

এটি লিঙ্কারকে অব্যবহৃত লাইব্রেরির বিরুদ্ধে লিঙ্ক না দেওয়ার নির্দেশ দেবে। আপনার উদাহরণ কোডে, সি ++ লাইব্রেরি ব্যবহৃত হয় না, সুতরাং এটি সি ++ স্ট্যান্ডার্ড লাইব্রেরির সাথে লিঙ্ক করা উচিত নয়।

আপনি এটি সি ফাইলের মাধ্যমেও পরীক্ষা করতে পারেন। আপনি যদি এর সাথে সংকলন করেন:

gcc main.c -lstdc ++

আপনি একটি সি প্রোগ্রাম তৈরি করলেও, গাদা ব্যবহার পুনরায় প্রদর্শিত হবে।

হিপ ব্যবহার আপনি ব্যবহার করছেন এমন নির্দিষ্ট সি ++ গ্রন্থাগার বাস্তবায়নের উপর নির্ভরশীল। আপনার ক্ষেত্রে, এটি GNU C ++ লাইব্রেরি, libstdc ++ । অন্যান্য বাস্তবায়নগুলি একই পরিমাণ মেমরি বরাদ্দ করতে পারে না, বা তারা কোনও মেমরি মোটেই বরাদ্দ করতে পারে না (কমপক্ষে প্রারম্ভকালে নয়) ) উদাহরণস্বরূপ এলএলভিএম সি ++ লাইব্রেরি ( libc ++ ) স্টার্টআপে হিপ বরাদ্দ দেয় না, কমপক্ষে আমার লিনাক্সে মেশিন:

ঝাঁকুনি ++ -stdlib = libc ++ main.cpp

গাদা ব্যবহার এর বিপরীতে লিঙ্ক না করা সমান।

(যদি সংকলন ব্যর্থ হয়, তবে সম্ভবত libc ++ ইনস্টল করা থাকে না The প্যাকেজের নামটিতে সাধারণত "libc ++" বা "libcxx" থাকে))


50
এই উত্তরটি দেখার পরে, আমার প্রথম চিন্তাটি হ'ল, " এই পতাকাটি যদি অনাহীন ওভারহেড হ্রাস করতে সহায়তা করে তবে এটি ডিফল্টরূপে কেন নয়? " এর উত্তম উত্তর কি আছে?
নাট

4
@ নাট আমার অনুমানটি ঠিক সময়ে সময়টি সংকলন করতে ধীর হয়। আপনি যখন একটি রিলিজ বিল্ড তৈরি করতে প্রস্তুত তখন আপনি এটি চালু করবেন। এছাড়াও একটি সাধারণ / বৃহত কোডবেসে পার্থক্যটি ন্যূনতম হতে পারে (আপনি যদি প্রচুর এসটিডি লাইব্রেরি ব্যবহার করেন ইত্যাদি)
ডারসি থমাস

24
@ নাট -Wl,--as-neededপতাকাটি আপনার দ্বারা নির্দিষ্ট করা লাইব্রেরিগুলি সরিয়ে দেয়-l পতাকাগুলিতে তবে আপনি প্রকৃতপক্ষে ব্যবহার করছেন না। সুতরাং আপনি যদি কোনও লাইব্রেরি ব্যবহার না করেন তবে কেবল এর বিপরীতে লিঙ্ক করবেন না। এর জন্য আপনার এই পতাকা লাগবে না। তবে, যদি আপনার বিল্ড সিস্টেমটিতে অনেকগুলি লাইব্রেরি যুক্ত হয় এবং সেগুলি পরিষ্কার করে দেওয়া এবং কেবল প্রয়োজনীয় লিঙ্কগুলি যুক্ত করা অনেক কাজ হয়ে যায়, তবে আপনি পরিবর্তে এই পতাকাটি ব্যবহার করতে পারেন। স্ট্যান্ডার্ড লাইব্রেরি যদিও এটির সাথে স্বয়ংক্রিয়ভাবে সংযুক্ত থাকে তবে এটি ব্যতিক্রম। সুতরাং এটি একটি কোণার কেস।
নিকস সি।

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

3
@NikosC। বিল্ডসিস্টেমগুলি আপনার অ্যাপ্লিকেশনটি কোন প্রতীকগুলি ব্যবহার করে এবং কোন গ্রন্থাগারগুলি সেগুলি প্রয়োগ করে (সংকলক, খিলান, ডিস্ট্রোস এবং সি / সি ++ লাইব্রেরির মধ্যে পরিবর্তিত হয়) স্বয়ংক্রিয়ভাবে জানে না। অধিকার রাইটটাইম লাইব্রেরিগুলির জন্য এটি সঠিকভাবে প্রাপ্ত হওয়া বরং সমস্যাযুক্ত ome তবে বিরল ক্ষেত্রে আপনার কোনও লাইব্রেরি প্রয়োজন, আপনার কেবলমাত্র সেইটির জন্য প্রয়োজন - না হিসাবে ব্যবহার করা উচিত - এবং অন্য যে কোনও জায়গায় প্রয়োজন হিসাবে ছেড়ে দেওয়া উচিত। আমি দেখেছি একটি ইউসকেস হ'ল ট্রেসিং / ডিবাগিংয়ের জন্য লাইব্রেরি (এলটিটিএনজি) এবং লাইব্রেরি যা প্রমাণীকরণ / সংযোগের ধরণের কিছু করে।
নরবার্ট ল্যাঞ্জ

16

জিসিসি বা ক্ল্যাং উভয়ই সংকলক নয় - তারা আসলে সরঞ্জামচেইন ড্রাইভার প্রোগ্রাম। এর অর্থ তারা সংকলক, সমাবেশকারী এবং সংযোগকারীকে অনুরোধ করে।

আপনি যদি নিজের কোডটি সি বা সি ++ সংকলক দিয়ে সংকলন করেন তবে একই সমাবেশটি উত্পাদিত হবে। এসেমব্লার একই জিনিস তৈরি করবে। পার্থক্যটি হ'ল টুলচেইন ড্রাইভার দুটি ভিন্ন ভাষার জন্য লিঙ্কারে বিভিন্ন ইনপুট সরবরাহ করবে: বিভিন্ন স্টার্টআপস (নাম্বার স্তরের স্তরে স্থির বা থ্রেড-স্থানীয় স্টোরেজ সময়কাল সহ বস্তুর জন্য কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরের জন্য কোড প্রয়োজন, এবং স্ট্যাকের জন্য অবকাঠামো প্রয়োজন ব্যতিক্রম প্রক্রিয়া চলাকালীন আনওয়াইন্ডিকে সমর্থন করার জন্য ফ্রেম, উদাহরণস্বরূপ), সি ++ স্ট্যান্ডার্ড লাইব্রেরি (যার মধ্যে নামস্থান স্তরে স্থিতিশীল স্টোরেজ সময়কালের অবজেক্টও রয়েছে), এবং সম্ভবত অতিরিক্ত রানটাইম লাইব্রেরি (উদাহরণস্বরূপ, স্ট্যাক-আনওয়াইন্ডিং অবকাঠামো সহ libgcc)।

সংক্ষেপে, এটি পাদদেশের প্রিন্ট বৃদ্ধির সংকলক নয়, আপনি সি ++ ভাষা নির্বাচন করে যে স্টাফ ব্যবহার করতে বেছে নিয়েছেন তা এটি লিঙ্ক করে।

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


আপনি প্রকৃতপক্ষে এটি ব্যবহার না করলেও ব্যতিক্রম হ্যান্ডলিং সক্ষম করার ক্ষেত্রে একটি ব্যয় হয়। এটি সাধারণভাবে সি ++ বৈশিষ্ট্যগুলির পক্ষে সাধারণ নয় এবং এটি এমন কিছু যা সি ++ স্ট্যান্ডার্ড ওয়ার্কিং গ্রুপগুলি ঠিক করার উপায়গুলি চিন্তা করার চেষ্টা করছে। ACCU 2019 এ ঔষধি Sutter এর তান আলাপ দেখুন ডি-fragmenting সি ++: ব্যতিক্রম আরো সাশ্রয়ী মূল্যের এবং ব্যবহারযোগ্য মেকিং । এটি একটি দুর্ভাগ্যজনক সত্য যদিও বর্তমান সি ++ এ। এবং traditionalতিহ্যবাহী সি ++ ব্যতিক্রমগুলি সম্ভবত সর্বদা সেই ব্যয় করতে পারে, এমনকি / যখন নতুন কী ব্যতিক্রমগুলির জন্য নতুন পদ্ধতিগুলি কোনও কীওয়ার্ডের সাথে যুক্ত হয়।
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.