সি ++ 11 কেন সি 99 হিসাবে মনোনীত ইনিশিয়ালাইজার তালিকাগুলি সমর্থন করে না? [বন্ধ]


121

বিবেচনা:

struct Person
{
    int height;
    int weight;
    int age;
};

int main()
{
    Person p { .age = 18 };
}

উপরের কোডটি C99 এ বৈধ, তবে সি ++ 11-এ বৈধ নয়।

কি ছিল এই জাতীয় সুবিধাজনক বৈশিষ্ট্যের জন্য সমর্থন বাদ দিয়ে স্ট্যান্ডার্ড কমিটির যুক্তি?


10
এটি অন্তর্ভুক্ত করার জন্য ডিজাইন কমিটির কাছে দৃশ্যত এটির কোনও ধারণা ছিল না, বা এটি কেবল বৈঠকে উঠে আসে নি। এটি লক্ষণীয় যে C99 মনোনীত প্রারম্ভিকগুলি সি ++ নির্দিষ্টকরণের কোনও সংস্করণে নেই। কনস্ট্রাক্টররা পছন্দসই আরম্ভের কাঠামো বলে মনে হয় এবং সঙ্গত কারণে: আপনি যদি এগুলি সঠিকভাবে লিখেন তবে তারা সামঞ্জস্যপূর্ণ অবজেক্টের সূচনার গ্যারান্টি দেয়।
রবার্ট হার্ভে

19
আপনার যুক্তি পিছিয়ে, কোনও ভাষার বৈশিষ্ট্য না থাকার জন্য যৌক্তিকতা থাকা দরকার না , এটিতে একটি এবং শক্তিশালী থাকার জন্য এটির যুক্তি প্রয়োজন। সি ++ যথেষ্ট স্ফীত হয়, যেমন এটি দাঁড়িয়ে আছে।
ম্যাথিউ এম।

42
একটি ভাল কারণ (যা স্টুফাইফিং র‌্যাপারগুলি লিখে কনস্ট্রাক্টরের সাথে সমাধান করা যায় না) তা হ'ল আপনি সি ++ ব্যবহার করুন বা না করুক না কেন, বেশিরভাগ আসল এপিআইগুলি সি হয়, সি ++ নয় এবং এর মধ্যে কয়েকটি নয় আপনাকে একটি কাঠামো সরবরাহ করতে পারে যা আপনি সেট করতে চান এক বা দুটি ক্ষেত্র - এবং প্রথমটি অগত্যা নয় - তবে বাকী শূন্য-সূচনা হওয়া দরকার। উইন 32 এপিআই এর OVERLAPPEDউদাহরণ। লিখতে সক্ষম হওয়ায় ={.Offset=12345};কোড আরও পরিষ্কার হয়ে যায় (এবং সম্ভবত ত্রুটি-প্রবণতা কম)। বিএসডি সকেট একই ধরণের উদাহরণ।
দামন

14
কোডটি mainআইনী C99 নয়। এটি পড়তে হবে struct Person p = { .age = 18 };
chqrlie

14
এফওয়াইআই সি ++ 20 মনোনীত প্রারম্ভিককে সমর্থন করবে
অ্যান্ড্রু তোমাওস

উত্তর:


34

সি ++ এর কনস্ট্রাক্টর রয়েছে। যদি কেবলমাত্র একজন সদস্যকে আরম্ভ করার জন্য এটি বোধগম্য হয় তবে এটি একটি উপযুক্ত নির্মাতা বাস্তবায়নের মাধ্যমে প্রোগ্রামে প্রকাশ করা যেতে পারে। এটি বিমূর্ততা সি ++ এর প্রকারের ধরণের।

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


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

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


12
আপনি যা বলেছেন তার জন্য একটি রেফারেন্স লিঙ্কটি দেখান কারণ সি ++ এর জন্য মনোনীত আরম্ভকারী না করার কারণ। আমি এর প্রস্তাবটি কখনও দেখেছি মনে করতে পারি না।
জোহানেস স্কাউব -

20
Personএটির জন্য কোনও কনস্ট্রাক্টর সরবরাহ না করার কারণটি কি তার লেখক ব্যবহারকারীদের সদস্যদের সেট এবং আরম্ভ করার জন্য সবচেয়ে সম্ভাব্য নমনীয়তা সরবরাহ করতে চেয়েছিলেন? ব্যবহারকারী ইতিমধ্যে লিখতে পারেন Person p = { 0, 0, 18 };(এবং ভাল কারণে)।
জোহানেস স্কাউব -

7
সেরকমই কিছু সম্প্রতি ওপেন -std.org/jtc1/sc22/wg21/docs/papers/2013/n3605.html দ্বারা সি ++ 14 টি তে গৃহীত হয়েছে ।
জোহানেস স্কাউব -

4
@ জোহানেস শ্যাব-লিটব আমি নিখুঁত যান্ত্রিক, অনুমানের কারণের বিষয়ে কথা বলছি না (যেমন, এটি কমিটির কাছে প্রস্তাবিত হয়নি)। আমি বিশ্বাস করি যা আমি প্রভাবশালী উপাদান হিসাবে বিশ্বাস করি। - Personএর খুব সি নকশা রয়েছে যাতে সি বৈশিষ্ট্যগুলি বোধগম্য হতে পারে। তবে সি ++ সম্ভবত একটি আরও ভাল নকশা সক্ষম করে যা মনোনীত প্রারম্ভিকদের প্রয়োজনীয়তাও মেনে চলে। - আমার দৃষ্টিতে সমষ্টিগুলির জন্য শ্রেণিগত আরম্ভকারীদের উপর বিধিনিষেধ অপসারণ করা নির্ধারিত প্রাথমিককরণগুলির তুলনায় সি ++ এর নীতিগুলির সাথে সামঞ্জস্যপূর্ণ।
bames53

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

89

15 জুলাই '17 P0329R4 এ স্বীকৃত হয়েছিলমান: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
এটি এর জন্য সীমিত সমর্থন নিয়ে আসেএর মনোনীত প্রারম্ভিক। এই সীমাবদ্ধতাটি C.1.7 [diff.decl] .4 দ্বারা প্রদত্ত হিসাবে বর্ণিত:

struct A { int x, y; };
struct B { struct A a; };

নিম্নলিখিত অবধি নির্ধারিত সূচনা, যা সিতে বৈধ, সি ++ এ সীমাবদ্ধ:

  • struct A a = { .y = 1, .x = 2 } সি ++ এ অবৈধ কারণ ডিজাইনারদের অবশ্যই ডেটা সদস্যদের ঘোষণার ক্রমে হাজির হতে হবে
  • int arr[3] = { [1] = 5 } সি ++ এ অবৈধ কারণ অ্যারে মনোনীত আরম্ভটি সমর্থিত নয়
  • struct B b = {.a.x = 0} সি ++ এ অবৈধ কারণ ডিজাইনারদের নেস্ট করা যায় না
  • struct A c = {.x = 1, 2} সি ++ এ অবৈধ কারণ ডেটাফিটরদের দ্বারা ডেটা সদস্যদের সমস্ত বা কোনওটিই আরম্ভ করা উচিত নয়

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

আমরা বিশ্বাস করি যে পরিবর্তনগুলি বাস্তবায়নের ক্ষেত্রে তুলনামূলক সহজবোধ্য হবে

কিন্তু স্ট্যান্ডার্ড কমিটি বারবার এই জাতীয় প্রস্তাবগুলি প্রত্যাখ্যান করে বলে:

EWG প্রস্তাবিত পদ্ধতির সাথে বিভিন্ন সমস্যা খুঁজে পেয়েছিল এবং সমস্যা সমাধানের চেষ্টা করা সম্ভব বলে মনে করেনি, কারণ এটি বহুবার চেষ্টা করা হয়েছে এবং প্রতিবার এটি ব্যর্থ হয়েছে

বেন ভয়েগের মন্তব্য আমাকে এই পদ্ধতির সাথে দুর্গম সমস্যাগুলি দেখতে সহায়তা করেছে; দেওয়া হলে

struct X {
    int c;
    char a;
    float b;
};

এই ক্রিয়াকলাপগুলিতে কী অর্ডারে ডাকা হবে : struct X foo = {.a = (char)f(), .b = g(), .c = h()} ? আশ্চর্যজনকভাবে, ইন:

যেকোন প্রারম্ভক সূচকে মূল্যায়ন করার ক্রমটি অনির্দিষ্টভাবে ক্রমযুক্ত হয় [ 1 ]

(ভিজ্যুয়াল সি ++, জিসিসি , এবং ক্ল্যাংয়ের আচরণের উপর একমত হয়েছে বলে মনে হচ্ছে তারা সকলেই এই ক্রমে কল করবে :)

  1. h()
  2. f()
  3. g()

তবে স্ট্যান্ডার্ডের অনির্দিষ্ট প্রকৃতির অর্থ এই যে যদি এই ফাংশনগুলির কোনও ইন্টারঅ্যাকশন থাকে তবে ফলস্বরূপ প্রোগ্রামের অবস্থাটিও অনির্দিষ্ট হবে, এবং সংকলক আপনাকে সতর্ক করবে না : দুর্ব্যবহারের মনোনীত প্রবর্তকদের সম্পর্কে সতর্ক হওয়ার কোনও উপায় আছে কি?

নেই কঠোর সূচনাকারী-তালিকা প্রয়োজনীয়তা আছে 11.6.4 [dcl.init.list] 4:

ব্রেসড-আরআইএন-তালিকার প্রারম্ভক-তালিকার মধ্যে, প্যাক সম্প্রসারণ (17.5.3) এর ফলে প্রাপ্ত ফলাফল সহ যে কোনও ইনিশিয়ালাইজার-ক্লজগুলি সেগুলি ক্রম হিসাবে প্রদর্শিত হয় evalu অর্থাত, প্রদত্ত ইনিশিয়ালার-ক্লজের সাথে যুক্ত প্রতিটি মান গণনা এবং পার্শ্ব ই ff ectটি কোনও মানক সংকলনের সাথে সংযুক্ত প্রতিটি মান এবং পার্শ্বপ্রতিক্রিয়া যা ইনিশিয়ালার-তালিকার কমা-বিচ্ছিন্ন তালিকায় অনুসরণ করে before

সুতরাং সহায়তায় এটি ক্রমে কার্যকর করতে হবে:

  1. f()
  2. g()
  3. h()

পূর্বের সাথে সামঞ্জস্যতা ভঙ্গ করা বাস্তবায়নের।
উপরে আলোচিত হিসাবে, এই বিষয়টিকে মনোনীত প্রাথমিকের উপর সীমাবদ্ধতার দ্বারা গৃহীত হয়েছে। তারা একটি মানযুক্ত আচরণ সরবরাহ করে, মনোনীত প্রারম্ভিকদের কার্যকর করার আদেশের গ্যারান্টি দেয়।


3
অবশ্যই, এই কোডটিতে: struct X { int c; char a; float b; }; X x = { .a = f(), .b = g(), .c = h() };কলটি h()হয় হয় আগে হয় f()বা হয় g()। সংজ্ঞাটি যদি struct Xকাছাকাছি না থাকে তবে এটি খুব অবাক হতে চলেছে। মনে রাখবেন যে ইনিশিয়ালাইজার এক্সপ্রেশনগুলি পার্শ্ব-প্রতিক্রিয়া মুক্ত থাকতে হবে না।
বেন ভয়েগট

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

2
@ ম্যাটম্যাকনাব: না, এটি আরও চরম নয়। তবে একজন প্রত্যাশা করেন যে বিকাশকারী ক্লাস কনস্ট্রাক্টর বাস্তবায়ন করছেন সদস্য ঘোষণার আদেশটি জানেন know ক্লাসের গ্রাহক সম্পূর্ণ ভিন্ন একটি প্রোগ্রামার হতে পারে। যেহেতু পুরো বিষয়টি সদস্যদের ক্রম সন্ধান না করেই সূচনা করার অনুমতি দেওয়া হওয়ায় প্রস্তাবটিতে এটি মারাত্মক ত্রুটির মতো বলে মনে হচ্ছে। যেহেতু মনোনীত ইনিশিয়ালাইজারগুলি বস্তুটি নির্মিত হচ্ছে তা উল্লেখ করতে পারে না, প্রথম ধারণাটি হ'ল প্রাথমিকভাবে অভিব্যক্তিগুলি প্রথমে পদবী আদেশে, তারপরে ঘোষণার ক্রমে সদস্য সূচনাকরণের মূল্যায়ন করা যেতে পারে। তবে ...
বেন ভয়েগ্ট

2
@ জোনাথনমি: ঠিক আছে, অন্য প্রশ্নের উত্তর দিয়েছে যে ... সি 99 এগ্রিগেট ইনিশিয়েলাইজারগুলি অর্ডারড নয়, সুতরাং মনোনীত আরম্ভকারীদের অর্ডার দেওয়ার কোনও প্রত্যাশা নেই। সি ++ ব্রেসড-আরআই-তালিকাগুলি অর্ডার করা হয়, এবং মনোনীত ইনিশিয়ালাইজারগুলির প্রস্তাব একটি সম্ভাব্য-আশ্চর্যজনক আদেশ ব্যবহার করে (আপনি উভয় লেসিকাল ক্রমের সাথে সামঞ্জস্য রাখতে পারবেন না, সমস্ত ব্রেসড-থ্রি তালিকার জন্য ব্যবহার করা হয়, এবং সদস্য অর্ডার, সিটি-ইনিশিয়ালাইজারের জন্য ব্যবহৃত হয়) তালিকাগুলি)
বেন ভয়েগট

3
জোনাথন: "সি ++ সাপোর্টের জন্য এটি ক্রমে কার্যকর করা উচিত [...] পূর্ববর্তী সি 99 বাস্তবায়নগুলির সাথে সামঞ্জস্যতা ভঙ্গ করা উচিত।" দুঃখিত, আমি এই এক পাই না। ১. যদি আদেশটি সি৯৯ এ সীমাহীন হয় তবে স্পষ্টতই কোনও আসল অর্ডার জরিমানা হওয়া উচিত, যেকোন স্বেচ্ছাসেবী সি ++ পছন্দ সহ। খ) দেশ সমর্থন না। ইনিশিয়ালাইজাররা সব ধরণের ইতোমধ্যে সি 99 এর সামঞ্জস্যকে আরও ভেঙে দেয় ...
এসজেড

34

কিছুটা হ্যাকারি, তাই কেবল মজাদার জন্য ভাগ করে নেওয়া।

#define with(T, ...)\
    ([&]{ T ${}; __VA_ARGS__; return $; }())

এবং এটি ব্যবহার করুন:

MyFunction(with(Params,
    $.Name = "Foo Bar",
    $.Age  = 18
));

যা প্রসারিত:

MyFunction(([&] {
 Params ${};
 $.Name = "Foo Bar", $.Age = 18;
 return $;
}()));

ঝরঝরে, একটি ভেরিয়েবল $টাইপের নামের সাথে একটি ল্যাম্বডা তৈরি করে Tএবং আপনি এর সদস্যদের এটি ফেরত দেওয়ার আগে সরাসরি তাকে অর্পণ করেন। নিফটি। এটি নিয়ে যদি কোনও পারফরম্যান্স উদ্বেগ থাকে তবে আমি অবাক হই।
ট্যানকোরসমাশ

1
অপ্টিমাইজড বিল্ডে আপনি ল্যাম্বডা বা এর অনুরোধের কোনও চিহ্ন খুঁজে পাবেন না। সবই ইনলাইনড।
কিবস

1
আমি এই উত্তরটি একেবারে পছন্দ করি।
সেফ রিড

6
ওহো। এমনকি জানতেন না $ একটি বৈধ নাম।
ক্রিস ওয়াটস

এটি লিগ্যাসি সি সংকলক দ্বারা সমর্থিত ছিল এবং পশ্চাদপটে সামঞ্জস্যের জন্য সমর্থন স্থগিত ছিল।
কেবাস

22

মনোনীত ইনিশিয়ালাইজারটি বর্তমানে C ++ ২০ টি বডি ওয়ার্কে অন্তর্ভুক্ত রয়েছে: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf যাতে আমরা শেষ পর্যন্ত তাদের দেখতে পাই!


3
তবে মনে রাখবেন যে এগুলি সীমাবদ্ধ: সি ++ তে সি এর সাথে সম্পর্কিত কার্যকারিতার তুলনায় মনোনীত ইনিশিয়ালাইজেশন সমর্থনটি নিষিদ্ধ করা হয়েছে সি ++ তে, অ স্থিতিশীল ডেটা সদস্যদের জন্য ডিজাইনারগুলি অবশ্যই ঘোষণার ক্রমে নির্দিষ্ট করতে হবে, অ্যারে উপাদানগুলির জন্য ডিজাইনার এবং নেস্টেড ডিজাইনারদের নয় সমর্থিত, এবং মনোনীত এবং অ-মনোনীত প্রারম্ভিকগুলি একই আরম্ভকারী তালিকায় মেশানো যাবে না। এর অর্থ হ'ল বিশেষত, আপনি এখনও সহজেই এনাম-কিড লুক টেবিল তৈরি করতে পারবেন না ।
Ruslan

@ রুসলান: আমি ভাবছি কেন সি ++ এগুলিকে এতটা বাধা দিয়েছে? আমি বুঝতে পেরেছি যে আইটেমগুলির মানগুলি মূল্যায়ন করা হয় এবং / অথবা কাঠামোতে লিখিত হয় সে অনুসারে আইটেমটি ইনালিটালাইজেশন তালিকায় নির্দিষ্ট করা আইটেমগুলির সাথে বা সদস্যরা কাঠামোর সাথে উপস্থিত হওয়া ক্রমের সাথে মেলে কিনা তা নিয়ে বিভ্রান্তি থাকতে পারে the এর সমাধানটি কেবল এটুকু বলতে হবে যে ইনিশিয়েশন এক্সপ্রেশনগুলি নির্বিচারে ক্রমানুসারে কার্যকর করা হয় এবং আরম্ভের সম্পূর্ণ না হওয়া অবধি অবজেক্টের আজীবন শুরু হয় না ( &অপারেটর তার জীবদ্দশায় সেই ঠিকানাটি ফিরিয়ে দেবে )।
সুপারক্যাট

5

দুটি কোর সি 99 এর বৈশিষ্ট্য যা সি ++ 11 লক্ষগুলিতে "মনোনীত প্রারম্ভিক এবং সি ++" উল্লেখ করেছে।

আমি মনে করি সম্ভাব্য অপ্টিমাইজেশানের সাথে সম্পর্কিত 'মনোনীত আরম্ভকারী'। এখানে আমি উদাহরণ হিসাবে "gcc / g ++" 5.1 ব্যবহার করি।

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>    
struct point {
    int x;
    int y;
};
const struct point a_point = {.x = 0, .y = 0};
int foo() {
    if(a_point.x == 0){
        printf("x == 0");
        return 0;
    }else{
        printf("x == 1");
        return 1;
    }
}
int main(int argc, char *argv[])
{
    return foo();
}

আমরা সংকলনের সময় জানতাম, a_point.xশূন্য, সুতরাং আমরা আশা করতে পারি যে fooএটি একটি একক হিসাবে অনুকূলিত হয়েছে printf

$ gcc -O3 a.c
$ gdb a.out
(gdb) disassemble foo
Dump of assembler code for function foo:
   0x00000000004004f0 <+0>: sub    $0x8,%rsp
   0x00000000004004f4 <+4>: mov    $0x4005bc,%edi
   0x00000000004004f9 <+9>: xor    %eax,%eax
   0x00000000004004fb <+11>:    callq  0x4003a0 <printf@plt>
   0x0000000000400500 <+16>:    xor    %eax,%eax
   0x0000000000400502 <+18>:    add    $0x8,%rsp
   0x0000000000400506 <+22>:    retq   
End of assembler dump.
(gdb) x /s 0x4005bc
0x4005bc:   "x == 0"

foox == 0শুধুমাত্র মুদ্রণ করতে অনুকূলিত হয় ।

সি ++ সংস্করণের জন্য,

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct point {
    point(int _x,int _y):x(_x),y(_y){}
    int x;
    int y;
};
const struct point a_point(0,0);
int foo() {
    if(a_point.x == 0){
        printf("x == 0");
        return 0;
    }else{
        printf("x == 1");
        return 1;
    }
}
int main(int argc, char *argv[])
{
    return foo();
}

এবং এটি অপ্টিমাইজড এসেম্বল কোডের আউটপুট।

g++ -O3 a.cc
$ gdb a.out
(gdb) disassemble foo
Dump of assembler code for function _Z3foov:
0x00000000004005c0 <+0>:    push   %rbx
0x00000000004005c1 <+1>:    mov    0x200489(%rip),%ebx        # 0x600a50 <_ZL7a_point>
0x00000000004005c7 <+7>:    test   %ebx,%ebx
0x00000000004005c9 <+9>:    je     0x4005e0 <_Z3foov+32>
0x00000000004005cb <+11>:   mov    $0x1,%ebx
0x00000000004005d0 <+16>:   mov    $0x4006a3,%edi
0x00000000004005d5 <+21>:   xor    %eax,%eax
0x00000000004005d7 <+23>:   callq  0x400460 <printf@plt>
0x00000000004005dc <+28>:   mov    %ebx,%eax
0x00000000004005de <+30>:   pop    %rbx
0x00000000004005df <+31>:   retq   
0x00000000004005e0 <+32>:   mov    $0x40069c,%edi
0x00000000004005e5 <+37>:   xor    %eax,%eax
0x00000000004005e7 <+39>:   callq  0x400460 <printf@plt>
0x00000000004005ec <+44>:   mov    %ebx,%eax
0x00000000004005ee <+46>:   pop    %rbx
0x00000000004005ef <+47>:   retq   

আমরা দেখতে পাচ্ছি যে a_pointএটি একটি সংকলন সময় ধ্রুবক মান নয়।


8
এখন চেষ্টা করুন constexpr point(int _x,int _y):x(_x),y(_y){}। ঝনঝন ++ এর অপ্টিমাইজারটি আপনার কোডের সাথে তুলনাও দূর করতে পারে বলে মনে হচ্ছে। সুতরাং, এটি কেবল একটি QoI সমস্যা।
dyp

আমি এটিও আশা করব যে এটির অভ্যন্তরীণ সংযোগ থাকলে সম্পূর্ণ এ-পয়েন্ট অবজেক্টটি অপ্টিমাইজ হবে। উদাহরণস্বরূপ এটি নামবিহীন নেমস্পেসে রাখুন এবং দেখুন কী ঘটে। goo.gl/wNL0HC
আরভিড

@ ডিআইপি: এমনকি কোনও নির্মাণকারীর সংজ্ঞা দেওয়া কেবল তখনই সম্ভব যখন টাইপটি আপনার নিয়ন্ত্রণে থাকে। আপনি এটি করতে পারবেন না, উদাহরণস্বরূপ, struct addrinfoবা এর জন্য struct sockaddr_in, তাই আপনাকে ঘোষণার থেকে পৃথক কার্যভারগুলি রেখে দেওয়া হয়েছে।
মুশিফিল

2
@ মুসিফিল কমপক্ষে সি ++ ১৪ এ, সেই সি-স্টাইল স্ট্রাক্টগুলি সঠিকভাবে একটি কনসেক্সট্রপ ফাংশনে অ্যাসাইনমেন্ট ব্যবহার করে স্থানীয় ভেরিয়েবল হিসাবে সেটআপ করা যেতে পারে এবং তারপরে সেই ফাংশন থেকে ফিরে আসে। তদ্ব্যতীত, আমার বক্তব্যটি সি ++ এর মধ্যে নির্মাণকারীর বিকল্প বাস্তবায়ন দেখাতে নয় যা অপ্টিমাইজেশনের অনুমতি দেয়, তবে এটি দেখান যে সংকলকটির পক্ষে আরম্ভের ফর্মটি পৃথক হলে এই অপ্টিমাইজেশন সম্পাদন করা সম্ভব। সংকলকটি যদি "যথেষ্ট ভাল" হয় (যেমন এই অনুকূলকরণের এই ফর্মটি সমর্থন করে), তবে আপনি কোনও সিটার বা মনোনীত আরম্ভকারী, বা অন্য কিছু ব্যবহার করেন না কেন এটি অপ্রাসঙ্গিক হওয়া উচিত।
25'17 ডায়াপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.