কনস্ট-সঠিকতা কর্মক্ষমতা উন্নত করতে পারে?


92

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

সুতরাং, আপনার কাছে কি উদাহরণ রয়েছে যেখানে দৃ const়তা সঠিকতা আপনার সংস্থাপককে আপনার প্রোগ্রামটির কার্যকারিতা উন্নত করতে সহায়তা করতে পারে?


50
রক্ষণাবেক্ষণের ক্ষেত্রে কনস্ট-সঠিকতা অন্যতম সেরা অনুশীলন। যদি আপনার সি ++ কোডটি সংশোধন না করে থাকে তবে এটি মূলত কচুরির স্তূপ, দুর্যোগের জন্য অপেক্ষা করার অপেক্ষা করছে। এটি কার্য সম্পাদনকে প্রভাবিত করার উদ্দেশ্যে নয়।

4
@ নীল বাটারওয়ার্থ: দুর্ভাগ্যক্রমে বিপরীতটি সত্য নয়।
বিটা

6
এখানে constপারফরম্যান্সের পার্থক্য তৈরি করার একটি উদাহরণ রয়েছে : স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ১১১১১91১৯/২ । যদিও এটি মূলত বাস্তবায়নের একটি মানের বিষয় ছিল। constসংকলক আইনীভাবে অপ্টিমাইজেশন করতে পারে কিনা তা নির্ধারণ করতে পারে নি , এটি ঠিক ঘটেছিল যে কম্পাইলারটি অনুপস্থিত থাকার সময় এটি তৈরি করতে ব্যর্থ হয়েছিল।
স্টিভ জেসপ

4
আমি নিশ্চিত যে "মরজেনবেল" প্রথম বাক্যে একটি 'কেবল' মিস করেছেন: এটি "একটি ভাল অনুশীলনই নয়" এর সাথে আরও বেশি বোঝা যায়।
ইয়ান এইচ

4
@ আইএনএইচ হ্যাঁ, আমি এটি বিবেচনা করেছি। তবে ওপি স্পষ্ট করার জন্য পর্যাপ্ত সময় দিয়েছে। আমি লোকেরা সত্যিই প্রশ্নগুলি পোস্ট করে এবং তারপরে কেবল অদৃশ্য হয়ে যায়।

উত্তর:


77

constশুদ্ধি পারফরম্যান্সের উন্নতি করতে পারবেন না কারণ const_castএবং mutableভাষায় হয়, এবং conformingly নিয়ম ভঙ্গ কোড অনুমতি দেয়। এটি সি ++ ১১-এ আরও খারাপ হয়ে যায়, যেখানে আপনার constডেটা উদাহরণস্বরূপ পয়েন্টার হতে পারে std::atomic, অর্থাত সংকলকটি অন্যান্য থ্রেডের পরিবর্তিত পরিবর্তনকে সম্মান করতে পারে।

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

যা সব বলেছিল, রক্ষণাবেক্ষণের ক্ষেত্রে constযথাযথতা একটি ভাল জিনিস। অন্যথায়, আপনার শ্রেণীর ক্লায়েন্টরা সেই শ্রেণীর অভ্যন্তরীণ সদস্যদের ভেঙে ফেলতে পারে। উদাহরণস্বরূপ, স্ট্যান্ডার্ডটি বিবেচনা করুন std::string::c_str()- যদি এটি কোনও কনস্টের মান ফেরত দিতে না পারে তবে আপনি স্ট্রিংয়ের অভ্যন্তরীণ বাফারের সাহায্যে ঘুরে দাঁড়াতে সক্ষম হবেন!

constপারফরম্যান্স কারণে ব্যবহার করবেন না । রক্ষণাবেক্ষণের কারণে এটি ব্যবহার করুন।


31
"আপনি স্ট্রিংয়ের অভ্যন্তরীণ বাফার দিয়ে ঘুরে দাঁড়াতে সক্ষম হবেন!" - গুরুতরভাবে, আপনি দুর্ঘটনাক্রমে অভ্যন্তরীণ বাফারটি দিয়ে স্ক্রু করতে সক্ষম হবেন । সংকলক ত্রুটির কারণে constসাইনপোস্টগুলি বলে, "আপনি বোকা কিছু করছেন"।
স্টিভ জেসপ

4
... এবং কনস্ট-কাস্টস হ'ল সাইনপোস্টগুলি বলে, "এই কোডটির লেখক কিছু চালাক করার চেষ্টা করছেন" ;-)
স্টিভ জেসোপ

4
@ স্টিভ জেসোপ - বা কনস্ট-কাস্ট হ'ল সাইনপোস্টগুলি বলছে "আমি কোনও কনস্ট্যান্ট-সঠিক সংস্থার কাছে কোডের একটি সংশোধন-সংশোধন করার চেষ্টা করছি এবং আমি একটিও ঠিক করতে পারি না"। যা, আমি আপনাকে বলি, কোনওভাবেই চালাক নয়, কেবল বিরক্তিকর।
মাইকেল কোহেন

7
@ মিশেল - হ্যাঁ, ফেয়ার পয়েন্ট। সম্ভবত আসল সাইনপোস্টটি "আপনি বোকা কিছু করছেন" নয়, "কেউ বোকা কিছু করছে" rather
স্টিভ জেসোপ

গডবোল্ট এবং আরডুইনো আমাকে বলেছিলেন যে কনস্টের সঠিকতা কেবল মজাদার জন্য নয়।
dgrat

31

বনভ.

বেশিরভাগই constনিখুঁতভাবে প্রোগ্রামারটির সুবিধার জন্য এবং সংকলকটিকে অপ্টিমাইজ করতে সহায়তা করে না কারণ এগুলি তাদের ফেলে দেওয়া আইনী এবং তাই তারা সংযোজকটিকে অপ্টিমাইজেশনের জন্য দরকারী কিছু না বলে। তবে কিছু কিছু const(আইনত) ফেলে দেওয়া যায় না এবং এটি সংযোজনকারীকে অনুকূলিতকরণের জন্য দরকারী তথ্য সরবরাহ করে with

উদাহরণস্বরূপ, কোনও constপ্রকারের সাথে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবলের অ্যাক্সেস অন্তর্নিহিত করা যেতে পারে তবে কোনও প্রকারবিহীন কোনওটিকে linedোকানো যায় constনা কারণ এটি রানটাইমে পরিবর্তিত হতে পারে।

https://godbolt.org/g/UEX4NB

সি ++:

int foo1 = 1;
const int foo2 = 2;

int get_foo1() {
    return foo1;
}

int get_foo2() {
    return foo2;
}

asm:

foo1:
        .long   1
foo2:
        .long   2
get_foo1():
        push    rbp
        mov     rbp, rsp
        mov     eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
        pop     rbp
        ret
get_foo2():
        push    rbp
        mov     rbp, rsp
        mov     eax, 2 ; foo2 has been replaced with an immediate 2
        pop     rbp
        ret

ব্যবহারিক শর্তাবলী, মনে রাখবেন যে constকর্মক্ষমতা উন্নত করতে পারে, বেশিরভাগ ক্ষেত্রে এটি না হয় বা এটি কিন্তু পরিবর্তন লক্ষণীয় হবে না। এর প্রাথমিক উপযোগিতা constঅপ্টিমাইজেশন নয়।


স্টিভ জেসোপ মূল প্রশ্নে তাঁর মন্তব্যে আরেকটি উদাহরণ দিয়েছেন যা উল্লেখযোগ্য কিছু বিষয় নিয়ে আসে। একটি ব্লক স্কোপে, কোনও সংকলকটির পক্ষে কোনও পরিবর্তনশীলকে রূপান্তরিত করা এবং constনির্ধারিতভাবে নির্ধারিত অনুসারে অপ্টিমাইজ করা হবে কিনা তা নির্ধারণ করা সম্ভব , কারণ সংকলকটি চলকটির সমস্ত ব্যবহার দেখতে পারে। বিপরীতে, উপরের উদাহরণে, foo1অন্য অনুবাদ ইউনিটগুলিতে এটি সংশোধন করা হতে পারে তা রূপান্তরিত হবে কিনা তা ভবিষ্যদ্বাণী করা অসম্ভব । আমি অনুমান করি যে একটি অনুমানী সংবেদনশীল অতি-সংকলক একটি সম্পূর্ণ প্রোগ্রাম বিশ্লেষণ করতে পারে এবং নির্ধারণ করতে পারে যে এটিতে প্রবেশপথের প্রবেশপথের বৈধতা আছে কিনা foo1... তবে বাস্তব সংকলকরা তা করতে পারে না।


@ এরিক্কার্টিন সেজন্য আমি উত্তরে সংকলকটির উল্লেখ করিনি। সাধারণত, উত্পন্ন সমাবেশটি পোস্ট করার সময়, আমি সংকলক এবং সংস্করণটি বর্ণনা করার বিষয়টি নিশ্চিত করেছিলাম, তবে এটি একটি অপ্টিমাইজেশন যা প্রতিটি বড় অপটিমাইজিং সংকলক সম্পাদন করবে তাই আমি এই ধারণাটি দিতে চাইনি যে এটি একটি সংকলকের বিশেষত was
প্রেসিওলাইটিক

4
@ এ্যাকর্ন এখানে একই উদাহরণটি রয়েছে তবে একটি শ্রেণি অবজেক্টের সাথে: Godbolt.org/z/R-Zfgc । এছাড়াও, উদাহরণের ভেরিয়েবলগুলির বাহ্যিক সংযোগ রয়েছে।
প্রেক্সিওলিটিক

6

আমার অভিজ্ঞতা, না

স্কেলার ভেরিয়েবলের জন্য, সংকলক যখনই মান পরিবর্তন হয় তখন তা নির্ধারণ করতে সক্ষম হয় এবং প্রয়োজনীয় অপ্টিমাইজেশন নিজেই সম্পাদন করে।

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

আপনি যদি অপ্টিমাইজেশন খুঁজছেন, আপনার __restrict__বিশেষ ফাংশন সংশোধক / বৈশিষ্ট্যগুলি বিবেচনা করা উচিত : http://gcc.gnu.org/onlinesocs/gcc/Function-Atributes.html


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