std :: অ্যারে বনাম অ্যারে কর্মক্ষমতা


87

আমি চাইলে খুব সাধারণ অ্যারে তৈরি করতে চাই

int myArray[3] = {1,2,3};

std::arrayপরিবর্তে আমার ব্যবহার করা উচিত?

std::array<int, 3> a = {{1, 2, 3}};

সাধারণের চেয়ে স্ট্যান্ড :: অ্যারে ব্যবহারের সুবিধা কী কী? এটা কি আরও পারফর্মেন্ট? অনুলিপি / অ্যাক্সেসের জন্য হ্যান্ডেল করা সহজ?


4
std এর সাথে বহুমাত্রিক অ্যারে সংজ্ঞায়িত করা কঠিন হবে
15-15

15
@গো গুড: কঠিন নয়, কেবল আরও ভার্বোজ।
মাইক সিমুর

4
পয়েন্টার ক্ষয়, একটি রেফারেন্স গ্রহণ ইত্যাদি ..., সি-অ্যারে সম্পর্কে অনেক কিছুই অদ্ভুত। পুনরুদ্ধারকারী সি-অ্যারেগুলির ক্ষেত্রে পয়েন্টার হতে পারে এবং এটি সংকলনও করতে for (auto i = ++std::begin(myArray); . . . পারে না (এটি মনে হয় মৌলিক ধরণের টেম্পোরারিগুলি কমপক্ষে 6
ঝড়ের

প্রারম্ভিককরণটি যাদুগতভাবে পৃথক: struct Direction { int32_t dw; int32_t dh; };এবং static const Direction DIRECTIONS[DIRECTIONS_COUNT] { { -1, 1}, {0,1}, {1,1} , { 1, 0 }, {1,-1}, {0,-1} , {-1,-1}, {-1,0} };সংকলন করে। তবে আপনি যদি std::array<Direction,DIRECTIONS_COUNT>একই ইনিশিয়ালাইজার তালিকার সাথে পরিবর্তিত হন , হঠাৎ আপনি "অত্যধিক প্রারম্ভিক" ত্রুটি পান। (ভিএস 2019 সম্প্রদায়টি ভাষা সহ = সি ++ 17)
বিটিক্লিকার

কেন আদিতে ডাবল বন্ধনী std::array?
মার্চ ২৩7777

উত্তর:


102

std::arrayসাধারণের বেশি ব্যবহার করার সুবিধা কী কী ?

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

এটা কি আরও পারফর্মেন্ট?

এটা ঠিক একই হওয়া উচিত। সংজ্ঞা অনুসারে, এটি একটি সাধারণ সদস্য যার একমাত্র সদস্য হিসাবে অ্যারে রয়েছে।

অনুলিপি / অ্যাক্সেসের জন্য হ্যান্ডেল করা সহজ?

হ্যাঁ.


41

std::arrayহ'ল সি-স্টাইলের অ্যারের চারপাশে একটি খুব পাতলা মোড়ক, মূলত হিসাবে সংজ্ঞায়িত

template<typename T, size_t N>
class array
{
public:
    T _data[N];
    T& operator[](size_t);
    const T& operator[](size_t) const;
    // other member functions and typedefs
};

এটি একটি সমষ্টিগত , এবং এটি আপনাকে এটি প্রায় একটি মৌলিক ধরণের (যেমন আপনি মান দ্বারা পাস করতে পারেন, নির্ধারণ করতে পারেন ইত্যাদি) ব্যবহার করতে পারবেন, যেখানে একটি স্ট্যান্ডার্ড সি অ্যারে নির্ধারিত বা সরাসরি অন্য অ্যারে অনুলিপি করা যাবে না)। আপনার কিছু স্ট্যান্ডার্ড বাস্তবায়ন (আপনার পছন্দসই আইডিই থেকে সংজ্ঞাতে লাফাই বা সরাসরি খোলার <array>) দিকে নজর দেওয়া উচিত , এটি সি ++ স্ট্যান্ডার্ড লাইব্রেরির একটি অংশ যা পড়তে এবং বুঝতে বেশ সহজ।


25

std::array সি অ্যারেগুলির জন্য শূন্য-ওভারহেড মোড়ক হিসাবে নকশা করা হয়েছে যা এটি অন্যান্য সি ++ ধারকগুলির শব্দার্থকগুলির মতো "স্বাভাবিক" মান দেয়।

আপনি অতিরিক্ত বৈশিষ্ট্যগুলি উপভোগ করার সময় রানটাইম পারফরম্যান্সে কোনও পার্থক্য লক্ষ্য করা উচিত নয়।

স্টাইল অ্যারেগুলির std::arrayপরিবর্তে ব্যবহার করা int[]আপনার পক্ষে সি ++ 11 বা হাত বাড়িয়ে নেওয়া ভাল ধারণা।


10

এটা কি আরও পারফর্মেন্ট?

এটা ঠিক একই হওয়া উচিত। সংজ্ঞা অনুসারে, এটি একটি সাধারণ সদস্য যার একমাত্র সদস্য হিসাবে অ্যারে রয়েছে।

পরিস্থিতি আরও জটিল বলে মনে হচ্ছে, যেমন std::arrayনির্দিষ্ট প্ল্যাটফর্মের উপর নির্ভর করে সি-অ্যারের তুলনায় সর্বদা অভিন্ন সমাবেশ কোড তৈরি হয় না।

আমি গডবোল্টে এই নির্দিষ্ট পরিস্থিতিটি পরীক্ষা করেছি :

#include <array>
void test(double* const C, const double* const A,
          const double* const B, const size_t size) {
  for (size_t i = 0; i < size; i++) {
    //double arr[2] = {0.e0};//
    std::array<double, 2> arr = {0.e0};//different to double arr[2] for some compiler
    for (size_t j = 0; j < size; j++) {
      arr[0] += A[i] * B[j];
      arr[1] += A[j] * B[i];
    }
    C[i] += arr[0];
    C[i] += arr[1];
  }
}

জিসিসি এবং ক্ল্যাং সি-অ্যারে সংস্করণ এবং সংস্করণ উভয়ের জন্য অভিন্ন সমাবেশ কোড উত্পাদন করে std::array

এমএসভিসি এবং আইসিপিসি , তবে প্রতিটি অ্যারে সংস্করণের জন্য আলাদা সমাবেশ কোড উত্পাদন করে code (আমি -Ofastএবং -Os; এমএসভিসি -Oxএবং এর সাথে আইসিপিসি 19 পরীক্ষা করেছি -Os)

আমার ধারণা নেই, কেন এটি কেস হয় (আমি সত্যই স্টাড :: অ্যারে এবং সি-অ্যারের একই রকম আচরণ আশা করবো)। হয়তো সেখানে বিভিন্ন অপ্টিমাইজেশন কৌশল নিযুক্ত করা হয়েছে।

সামান্য অতিরিক্ত হিসাবে: আইসিপিসিতে একটি বাগ রয়েছে বলে মনে হচ্ছে

#pragma simd 

কিছু পরিস্থিতিতে সি-অ্যারে ব্যবহার করার সময় ভেক্টরাইজেশনের জন্য (সি-অ্যারে কোডটি একটি ভুল আউটপুট উত্পন্ন করে; std::arrayসংস্করণটি ভাল কাজ করে)।

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

আমি যখন নিশ্চিত হয়েছি যে আমি কেবল সি-অ্যারে / std::arrayএবং সম্পর্কে কিছু ভুল বুঝি নি তখন আমি ইন্টেলের সাথে একটি বাগ-প্রতিবেদন ফাইল করব #pragma simd


4
সংকলক বাগ হিসাবে বিবেচনা করা যেতে পারে?
OznOg

8

std::arrayকাঁচা অ্যারে না করে যখন মান শব্দার্থক আছে। এর অর্থ আপনি অনুলিপি হিসাবে std::arrayএটি অনুলিপি এবং চিকিত্সা করতে পারেন। আপনি এগুলি ফাংশন আর্গুমেন্ট হিসাবে মান বা রেফারেন্সের মাধ্যমে গ্রহণ করতে পারেন এবং আপনি তাদের মান দিয়ে ফেরত দিতে পারেন।

যদি আপনি কখনই একটি অনুলিপি করেন না std::array, তবে কাঁচা অ্যারের চেয়ে পারফরম্যান্সের পার্থক্য নেই। আপনার যদি অনুলিপিগুলি তৈরি করার প্রয়োজন হয় std::arrayতবে সঠিক কাজটি করবে এবং এখনও সমান পারফরম্যান্স দেওয়া উচিত।

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