সি ++ এ ইনলাইন ফাংশন। আলোচ্য বিষয়টি কি?


19

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


উত্তর:


40

inlineসি থেকে; এটি সি ++ তে নতুন ছিল না।

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

শব্দটি এখন সি ++ এর অর্থ কী, এটির একাধিক অভিন্ন সংজ্ঞা থাকতে পারে এবং এটি ব্যবহার করে এমন প্রতিটি অনুবাদ ইউনিটে সংজ্ঞা দেওয়া দরকার needs (অন্য কথায়, আপনার এটি নিশ্চিত করা দরকার যে এটি অন্তর্ভুক্ত করা যেতে পারে)) inlineকোনও সমস্যা ছাড়াই আপনার একটি শিরোনামে একটি ফাংশন থাকতে পারে এবং শ্রেণীর সংজ্ঞায় সংজ্ঞায়িত সদস্য ফাংশনগুলি স্বয়ংক্রিয়ভাবে কার্যকর হয় inline


3
ইতিহাসের জন্য +1 inline
তমারা উইজসম্যান

11
আমি নিশ্চিত যে inlineএটি প্রথমে সি ++ তে প্রমিত করা হয়েছিল, যদিও এটি সি .... ইয়ে্পে বিক্রেতার এক্সটেনশন হিসাবে ইতিমধ্যে উপলব্ধ ছিল, মনে হচ্ছে এটি সি 99 এর সি স্ট্যান্ডার্ডে যুক্ত হয়েছিল।
বেন ভয়েগট

@ বেন ভয়েগ: আপনি ঠিক বলেছেন। আমি প্রথম সিটিতে এটির মুখোমুখি হয়েছিলাম
ডেভিড থর্নলি

5
এছাড়াও সচেতন থাকুন যে কেবল ইতিহাসটিই ভুল নয়, তবে inlineC99 এর নিয়মগুলিও inlineসি ++ এর নিয়ম থেকে আলাদা ।
আলফ পি স্টেইনবাচ

27

মূলত inlineএকটি খুব শক্ত ইঙ্গিত ছিল যা ফাংশনটিতে কল করা উচিত in

তবে এর একমাত্র গ্যারান্টিযুক্ত এফেক্ট inlineহ'ল একাধিক অনুবাদ ইউনিটগুলিতে কোনও ক্রিয়াকে সংজ্ঞায়িত করা (কার্যকরভাবে অভিন্নভাবে) মঞ্জুরি দেওয়া, উদাহরণস্বরূপ, আপনি একটি শিরোনাম ফাইলে সংজ্ঞাটি রাখেন।

আজকাল, কিছু সংকলক ইনলাইনিং ইঙ্গিত যেমন g ++ অনুসরণ করার জন্য খুব আগ্রহী। এবং কিছু সংকলক এটি কম গুরুত্ব সহকারে নেয়, যেমন ভিজ্যুয়াল সি ++। তবে সকলকে গ্যারান্টি মেনে চলতে হবে।

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

এটি দুর্ভাগ্যজনক inline(বা আরও ভাল, বাতিলযোগ্য সংজ্ঞা সম্পর্কে একটি পৃথক কীওয়ার্ড) - ডেটা প্রয়োগ করা যাবে না ।

কেবলমাত্র শিরোলেখের মডিউলগুলি আরও জনপ্রিয় হয়ে উঠায় লিঙ্কার স্তরের ছাড়যোগ্য ডেটাগুলির প্রয়োজনীয়তা বৃদ্ধি পেয়েছে। উদাহরণস্বরূপ, অনেক বুস্ট সাব-লাইব্রেরি কেবল শিরোনাম হয়।

তথ্যের জন্য আপনি টেমপ্লেটগুলির সাথে একটি সামান্য কৌশল প্রয়োগ করতে পারেন। এটি কোনও শ্রেণির টেম্পলেটে সংজ্ঞায়িত করুন, typedefটেমপ্লেট পরামিতি void(বা যাই হোক না কেন) সরবরাহ করুন। কারণ ওয়ান ডেফিনিশন রুল টেমপ্লেটগুলির জন্য একটি নির্দিষ্ট ব্যতিক্রম করে।

দ্রষ্টব্য:
¹ inlineভেরিয়েবল করা হবে সি ++ 17 সমর্থিত


1
অতিরিক্ত তথ্য সম্পর্কে +1 inline
তমারা উইজসম্যান

1
" কার্যকরভাবে অভিন্নভাবে " আসলে একটি খুব জটিল অবস্থা, কারণ খুব খারাপভাবে ডিজাইন করা সি ++ ভাষা সাধারণভাবে সক্ষম এবং যত্নবান প্রোগ্রামারগুলিকে যুক্তিসঙ্গত কিন্তু আনুষ্ঠানিকভাবে অপরিবর্তিত কোড লিখতে চেষ্টা করে যা স্থির বস্তু ব্যবহার করে - আমি অবাক হই যে কতজন কমিটির সদস্যরা তাদের ফাঁদে পড়ে?
কৌতূহলী

6

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


5
তবে সংকলকটি সাধারণভাবে প্রোগ্রামারের তুলনায় এটিকে আরও ভাল (এবং করতে পারে) চিত্রিত করতে পারে। সুতরাং এটি কোনও বৈধ যুক্তি নয়।
কনরাড রুডলফ 10'11

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

3

"ইনলাইন" বুঝতে আপনার ইতিহাস এবং 20 বছর আগে (এবং 30) জীবন কেমন ছিল তা বুঝতে হবে।

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

সুতরাং প্রতিটি কোড ফাইল পৃথকভাবে একটি বস্তুর ফাইলগুলিতে সংকলিত হয়েছিল। প্রতিটি বস্তু ফাইল ফাংশনের "ঠিকানা" সহ এতে থাকা সমস্ত ফাংশনের তালিকা দিয়ে শুরু করে। কোনও অবজেক্ট ফাইলে কলটির অবস্থানের পাশাপাশি অন্যান্য অবজেক্ট ফাইলগুলিতে ডাকা সমস্ত ফাংশনের একটি তালিকাও ছিল।

কোনও লিঙ্কার প্রথমে সমস্ত অবজেক্ট ফাইলগুলি পড়ত এবং তারা যে ফাইল এবং সেখানে থাকে তার ঠিকানার সাথে তারা রফতানি করে এমন সমস্ত ফাংশনের একটি তালিকা তৈরি করে। এটি ফাংশনের ঠিকানা সহ সমস্ত "বহিরাগত" ফাংশন কলগুলি আপডেট করার সময়, সমস্ত ফর্মের প্রোগ্রাম প্রোগ্রামে আউটপুট করে পুনরায় পড়বে read

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

সংকলকটি কেবলমাত্র ".c" বা ".cpp" ফাইলে কোডটি দেখেছিল এটি সমস্ত অন্তর্ভুক্ত শিরোলেখ ফাইলগুলির সাথে সংকলন করে। সুতরাং এটি অন্যান্য ".c" বা ".cpp" ফাইলগুলিতে কোডের ভিত্তিতে কোনও অপ্টিমাইজেশন করতে পারে না।

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

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

এই দিনগুলিতে "লেনকারগুলি" প্রচুর কোড অপ্টিমাইজেশন করে এবং সংকলক হিসাবে কোনও কোনও দলের দ্বারা এটি লেখার ঝোঁক। সংকলকটি প্রায়শই পরীক্ষা করে কোডটি সঠিক এবং এটি "সংকুচিত" করে, মেশিন কোড তৈরির বেশিরভাগ কার্য লিঙ্কারে রেখে দেয়।


2

আসুন দেখে নেওয়া যাক মান কী বলেছে (গা bold়ভাবে গুরুত্বপূর্ণ অংশগুলি হাইলাইট করেছে):

2. একটি ইনলাইন স্পেসিফায়ারযুক্ত একটি ফাংশন ঘোষণা একটি ইনলাইন ফাংশন ঘোষণা করে। ইনলাইন স্পেসিফায়ার প্রয়োগের দিকে ইঙ্গিত করে যে কল করার সময় ফাংশন বডির ইনলাইন প্রতিস্থাপনটি সাধারণ ফাংশন কল ব্যবস্থায় অগ্রাধিকার দেওয়া হয়। কল করার পয়েন্টে এই ইনলাইন প্রতিস্থাপন সম্পাদনের জন্য কোনও প্রয়োগের প্রয়োজন হয় না ; তবে, যদি এই ইনলাইন বিকল্পটি বাদ দেওয়া হয় তবে ইনলাইন ফাংশনগুলির জন্য অন্যান্য বিধিগুলি এখনও সম্মানিত হবে।

- সি ++ স্ট্যান্ডার্ড, আইএসও / আইসিসি 14882: 2003 , 7.1.2 ফাংশন সুনির্দিষ্ট [dcl.fct.spec]

সুতরাং, আপনি যদি নিশ্চিত হতে চান তবে আপনার কম্পাইলারের ডকুমেন্টেশনটি পড়া উচিত।

সমস্ত কিছু অন্তর্ভুক্ত করা একটি খারাপ ধারণা, কারণ এর ফলে প্রচুর নকল মেশিন কোড আসতে পারে ...

সুতরাং আপনি জানতে হবে:

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

- সি ++ এফএকিউ, ইনলাইন ফাংশন , 9.3 inlineফাংশনগুলি কার্যকারিতা উন্নত করে?


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

এটি যদি আপনার মতো ঠিক একই রকম বলে তবে এটি কীভাবে প্রাসঙ্গিক নয়? কোন সহজ উত্তর নেই
তমারা উইজসম্যান

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

@ প্রিয়: "কী কথা?" FAQ মান্য হয় না, তাই আমি প্রশ্নের মধ্যে জিজ্ঞাসা করা প্রশ্নের উত্তর দিচ্ছি। আমি inlineজ্ঞানটি পুনর্বিবেচনা করে বিষয়টি বলছি যেহেতু ওপি মনে হয় যে কোনও অংশ মিস করেছে তাই এটি মূল কারণ যা তিনি পয়েন্টটি পান না। একটি পয়েন্ট পাওয়ার জন্য তার সেই বিন্দুটির নীচে কী রয়েছে তা বোঝা দরকার ...
তমারা উইজসম্যান

জাহান্নাম কেন এফএকিউ অনুসরণ করবে না? স্ট্যান্ডার্ড ইনলাইন কীওয়ার্ডের বাক্য গঠন এবং শব্দার্থবিজ্ঞানের বর্ণনা দেয় এবং ওপিএস প্রশ্নটি উদ্দেশ্যটি কী, কখন এটি ব্যবহার করা উচিত, কোন সমস্যার সমাধান করার কথা? আমি দেখতে পাচ্ছি না যে এটি কীভাবে FAQ মানছে না।
প্রিয় Žদ্রো

1

আমি আপনাকে ইনলাইন কীওয়ার্ডটি ব্যবহারের জন্য একটি ভাল কারণ দেই।

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

আসুন বলুন যে কলটির সময়টি প্রায় 60 মিমি (কেবল কল করার জন্য, আসল ফাংশন নয়) এবং আপনার 50 টি পুনরাবৃত্তি (কোনও গাছের মধ্যে লুপ বা পুনরাবৃত্তি কল) করতে হয়।

এই ফাংশন কলটি থেকে কেবল সামনে এবং পিছনে যাওয়ার সময়টি 60 * 50 = 3000 (3 সেকেন্ড) সময় নেবে।

আপনার যদি স্মৃতি থাকে তবে আপনি অবশ্যই 3 সেকেন্ড বাঁচাতে একটি ইনলাইন করবেন।

সুতরাং আপনার যখন এক্সিকিউশন গতির প্রয়োজন হয় তখন মূলত ইনলাইন ব্যবহৃত হয়। কিছু প্রকল্পের সাথে আমি জড়িত ছিলাম, কল করার সময়টি কার্যকর করার সময়ের চেয়ে দীর্ঘ ছিল, ইনলাইনটি ব্যবহার করার সময় একটি সর্বোত্তম পরিস্থিতি।


এহ, কি? আপনার কোডটিতে ইনলাইন স্থাপনের অর্থ এই নয় যে সংকলকটি আসলে এটি ইনলাইন করবে এবং এটি সেখানে রাখার অর্থ এই নয় যে এটি অভ্যাস করবে না। এটি কেবল একটি ইঙ্গিত, যা বেশিরভাগই আজকের সংকলকগণ দ্বারা উপেক্ষা করা হয়। সংকলক যদি ইনলাইন করতে দরকারী বলে মনে করে, তবে তা হবে, অন্যথায় এটি অভ্যাস করবে না। সেখানে আপনার কোনও আসল নিয়ন্ত্রণ নেই। ওপি এটি ইতিমধ্যে জানে, এবং জিজ্ঞাসা করছে, আমি উদ্ধৃত করছি: "কী কথা?" কে এই সম্পর্কে +1 দেয়? এটি উভয়ই বিভ্রান্তিমূলক (যে কীওয়ার্ড ইনলাইনটি ইনলাইনিং প্রয়োগ করে) এবং প্রশ্নের সাথে অপ্রাসঙ্গিক।
avorড্রালো

2
পছন্দ করুন আমি কেন প্রশ্নটি ইনলাইন ব্যবহার করব? আমার বক্তব্যটি দেখানো ছিল যে আপনি মেমরির দামে দ্রুত কোডটি পেতে পারেন। প্রতিটি সংকলক ইনলাইন কীওয়ার্ডটি ভিন্নভাবে পরিচালনা করতে পারে, সুতরাং আপনার ডকুমেন্টেশন যাচাই করা দরকার, যা আমি উল্লেখ করি নি। যেহেতু আপনি সর্বদা অতিরিক্ত মেমরির ওভারহেড ইনলাইনগুলি তৈরি করতে সক্ষম হন না, এটি কখন ব্যবহার করবেন তা "গাইডডে" কার্যকর। আমি এটাও বলিনি যে ইনলাইনগুলি প্রয়োগ করা হয়েছে। কেউ এই উত্তরটি তার কাছে দরকারী বলে খুঁজে পেয়েছে এবং +1 করেছে, দয়া করে শ্রদ্ধা করুন যে অন্যের অন্য স্তরের অভিজ্ঞতা থাকতে পারে এবং তুচ্ছ কিছু উপকারী হতে পারে।
ম্যাক্স কিয়েলল্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.