সি ++ স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নের সাথে তুলনা / বৈপরীত্যের কোনও ডকুমেন্টেশন আছে কি? [বন্ধ]


16

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

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

বিশেষত আমি এই জাতীয় প্রশ্নের উত্তর খুঁজছি:

  • স্ট্যান্ডার্ড পাত্রে কত স্মৃতি ওভারহেড যুক্ত?
  • কি ধারকগুলি, যদি থাকে তবে কেবল ঘোষিত হয়ে গতিশীল বরাদ্দ থাকে?
  • Std :: স্ট্রিং কি অনুলিপি করে লিখতে পারে? সংক্ষিপ্ত স্ট্রিং অপ্টিমাইজেশন? দড়াদড়ি?
  • এসটিডি :: ডীক কোনও রিং বাফার ব্যবহার করে বা এটি বাজে?

আমি এমন ছাপের dequeমধ্যে ছিলাম যেটি সবসময় ভেক্টরের সাথে এসটিএলে প্রয়োগ করা হয়েছিল।
টেট্রাড

@ টেট্র্যাড: কয়েক সপ্তাহ আগে পর্যন্ত আমি খুব ছিলাম, তবে তখন আমি পড়লাম এটি প্রায়শই দড়ির মতো কাঠামোর দ্বারা প্রয়োগ করা হয়েছিল - এবং এটি এসটিএলপোর্টে রয়েছে বলে মনে হয়।

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

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

2
@ জো ওরেসনিগ আমি সত্যিই বন্ধ করতে ভোট দিতে চাই না কারণ আমি এর পরিণতিতে আগ্রহী। : পি
কম্যুনিস্ট হাঁস

উত্তর:


6

আপনি যদি এইরকম তুলনা চার্টটি না পান, বিকল্পটি হল একটি প্রশ্নে এসটিএল শ্রেণিতে একটি নিজস্ব বরাদ্দকারী ইনজেকশন করা এবং কিছু লগিং যুক্ত করা।

আমি পরীক্ষামূলক বাস্তবায়নটি (ভিসি ৮.০) কেবল একটি স্ট্রিং / ভেক্টর / ডিউক ঘোষণা করে কোনও মেমরি বরাদ্দ ব্যবহার করে না, তবে এর জন্য তালিকা এবং মানচিত্র রয়েছে। স্ট্রিংয়ের একটি সংক্ষিপ্ত স্ট্রিং অপ্টিমাইজেশন রয়েছে, যেহেতু 3 টি অক্ষর যুক্ত করার কারণে একটি বরাদ্দকে ট্রিগার করা যায় না। কোডের নীচে আউটপুট যুক্ত করা হয়।

// basic allocator implementation used from here
// http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <map>

template <class T> class my_allocator;

// specialize for void:
template <> 
class my_allocator<void> 
{
public:
    typedef void*       pointer;
    typedef const void* const_pointer;
    // reference to void members are impossible.
    typedef void value_type;
    template <class U> 
    struct rebind 
    { 
        typedef my_allocator<U> other; 
    };
};

#define LOG_ALLOC_SIZE(call, size)      std::cout << "  " << call << "  " << std::setw(2) << size << " byte" << std::endl

template <class T> 
class my_allocator 
{
public:
    typedef size_t    size_type;
    typedef ptrdiff_t difference_type;
    typedef T*        pointer;
    typedef const T*  const_pointer;
    typedef T&        reference;
    typedef const T&  const_reference;
    typedef T         value_type;
    template <class U> 
    struct rebind 
    { 
        typedef my_allocator<U> other; 
    };

    my_allocator() throw() : alloc() {}
    my_allocator(const my_allocator&b) throw() : alloc(b.alloc) {}

    template <class U> my_allocator(const my_allocator<U>&b) throw() : alloc(b.alloc) {}
    ~my_allocator() throw() {}

    pointer       address(reference x) const                    { return alloc.address(x); }
    const_pointer address(const_reference x) const              { return alloc.address(x); }

    pointer allocate(size_type s, 
               my_allocator<void>::const_pointer hint = 0)      { LOG_ALLOC_SIZE("my_allocator::allocate  ", s * sizeof(T)); return alloc.allocate(s, hint); }
    void deallocate(pointer p, size_type n)                     { LOG_ALLOC_SIZE("my_allocator::deallocate", n * sizeof(T)); alloc.deallocate(p, n); }

    size_type max_size() const throw()                          { return alloc.max_size(); }

    void construct(pointer p, const T& val)                     { alloc.construct(p, val); }
    void destroy(pointer p)                                     { alloc.destroy(p); }

    std::allocator<T> alloc;
};

int main(int argc, char *argv[])
{

    {
        typedef std::basic_string<char, std::char_traits<char>, my_allocator<char> > my_string;

        std::cout << "===============================================" << std::endl;
        std::cout << "my_string ctor start" << std::endl;
        my_string test;
        std::cout << "my_string ctor end" << std::endl;
        std::cout << "my_string add 3 chars" << std::endl;
        test = "abc";
        std::cout << "my_string add a huge number of chars chars" << std::endl;
        test += "d df uodfug ondusgp idugnösndögs ifdögsdoiug ösodifugnösdiuödofu odsugöodiu niu od unoudö n nodsu nosfdi un abc";
        std::cout << "my_string copy" << std::endl;
        my_string copy = test;
        std::cout << "my_string copy on write test" << std::endl;
        copy[3] = 'X';
        std::cout << "my_string dtors start" << std::endl;
    }

    {
        std::cout << std::endl << "===============================================" << std::endl;
        std::cout << "vector ctor start" << std::endl;
        std::vector<int, my_allocator<int> > v;
        std::cout << "vector ctor end" << std::endl;
        for(int i = 0; i < 5; ++i)
        {
            v.push_back(i);
        }
        std::cout << "vector dtor starts" << std::endl;
    }

    {
        std::cout << std::endl << "===============================================" << std::endl;
        std::cout << "deque ctor start" << std::endl;
        std::deque<int, my_allocator<int> > d;
        std::cout << "deque ctor end" << std::endl;
        for(int i = 0; i < 5; ++i)
        {
            std::cout << "deque insert start" << std::endl;
            d.push_back(i);
            std::cout << "deque insert end" << std::endl;
        }
        std::cout << "deque dtor starts" << std::endl;
    }

    {
        std::cout << std::endl << "===============================================" << std::endl;
        std::cout << "list ctor start" << std::endl;
        std::list<int, my_allocator<int> > l;
        std::cout << "list ctor end" << std::endl;
        for(int i = 0; i < 5; ++i)
        {
            std::cout << "list insert start" << std::endl;
            l.push_back(i);
            std::cout << "list insert end" << std::endl;
        }
        std::cout << "list dtor starts" << std::endl;
    }

    {
        std::cout << std::endl << "===============================================" << std::endl;
        std::cout << "map ctor start" << std::endl;
        std::map<int, float, std::less<int>, my_allocator<std::pair<const int, float> > > m;
        std::cout << "map ctor end" << std::endl;
        for(int i = 0; i < 5; ++i)
        {
            std::cout << "map insert start" << std::endl;
            std::pair<int, float> a(i, (float)i);
            m.insert(a);
            std::cout << "map insert end" << std::endl;
        }
        std::cout << "map dtor starts" << std::endl;
    }

    return 0;
}

এখনও পর্যন্ত ভিসি 8 এবং এসটিএলপোর্ট 5.2 পরীক্ষা করা হয়েছে, এখানে তুলনাটি এখানে রয়েছে (পরীক্ষায় অন্তর্ভুক্ত: স্ট্রিং, ভেক্টর, ডেক, তালিকা, মানচিত্র)

                    Allocation on declare   Overhead List Node      Overhead Map Node

VC8                 map, list               8 Byte                  16 Byte
STLPort 5.2 (VC8)   deque                   8 Byte                  16 Byte
Paulhodge's EASTL   (none)                  8 Byte                  16 Byte

ভিসি 8 আউটপুট স্ট্রিং / ভেক্টর / ডিউক / তালিকা / মানচিত্র:

===============================================
my_string ctor start
my_string ctor end
my_string add 3 chars
my_string add a huge number of chars chars
  my_allocator::allocate    128 byte
my_string copy
  my_allocator::allocate    128 byte
my_string copy on write test
my_string dtors start
  my_allocator::deallocate  128 byte
  my_allocator::deallocate  128 byte

===============================================
vector ctor start
vector ctor end
  my_allocator::allocate     4 byte
  my_allocator::allocate     8 byte
  my_allocator::deallocate   4 byte
  my_allocator::allocate    12 byte
  my_allocator::deallocate   8 byte
  my_allocator::allocate    16 byte
  my_allocator::deallocate  12 byte
  my_allocator::allocate    24 byte
  my_allocator::deallocate  16 byte
vector dtor starts
  my_allocator::deallocate  24 byte

===============================================
deque ctor start
deque ctor end
deque insert start
  my_allocator::allocate    32 byte
  my_allocator::allocate    16 byte
deque insert end
deque insert start
deque insert end
deque insert start
deque insert end
deque insert start
deque insert end
deque insert start
  my_allocator::allocate    16 byte
deque insert end
deque dtor starts
  my_allocator::deallocate  16 byte
  my_allocator::deallocate  16 byte
  my_allocator::deallocate  32 byte

===============================================
list ctor start
  my_allocator::allocate    12 byte
list ctor end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list dtor starts
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte

===============================================
map ctor start
  my_allocator::allocate    24 byte
map ctor end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map dtor starts
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte

এসটিএলপোর্ট 5.2। ভিসি 8 দিয়ে সংকলিত আউটপুট

===============================================
my_string ctor start
my_string ctor end
my_string add 3 chars
my_string add a huge number of chars chars
  my_allocator::allocate    115 byte
my_string copy
  my_allocator::allocate    115 byte
my_string copy on write test
my_string dtors start
  my_allocator::deallocate  115 byte
  my_allocator::deallocate  115 byte

===============================================
vector ctor start
vector ctor end
  my_allocator::allocate     4 byte
  my_allocator::deallocate   0 byte
  my_allocator::allocate     8 byte
  my_allocator::deallocate   4 byte
  my_allocator::allocate    16 byte
  my_allocator::deallocate   8 byte
  my_allocator::allocate    32 byte
  my_allocator::deallocate  16 byte
vector dtor starts
  my_allocator::deallocate  32 byte

===============================================
deque ctor start
  my_allocator::allocate    32 byte
  my_allocator::allocate    128 byte
deque ctor end
deque insert start
deque insert end
deque insert start
deque insert end
deque insert start
deque insert end
deque insert start
deque insert end
deque insert start
deque insert end
deque dtor starts
  my_allocator::deallocate  128 byte
  my_allocator::deallocate  32 byte

===============================================
list ctor start
list ctor end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list dtor starts
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte

===============================================
map ctor start
map ctor end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map dtor starts
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte

EASTL ফলাফল, কোন প্রকার উপলব্ধ নেই

===============================================
my_string ctor start
my_string ctor end
my_string add 3 chars
  my_allocator::allocate     9 byte
my_string add a huge number of chars chars
  my_allocator::allocate    115 byte
  my_allocator::deallocate   9 byte
my_string copy
  my_allocator::allocate    115 byte
my_string copy on write test
my_string dtors start
  my_allocator::deallocate  115 byte
  my_allocator::deallocate  115 byte

===============================================
vector ctor start
vector ctor end
  my_allocator::allocate     4 byte
  my_allocator::allocate     8 byte
  my_allocator::deallocate   4 byte
  my_allocator::allocate    16 byte
  my_allocator::deallocate   8 byte
  my_allocator::allocate    32 byte
  my_allocator::deallocate  16 byte
vector dtor starts
  my_allocator::deallocate  32 byte

===============================================
list ctor start
list ctor end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list insert start
  my_allocator::allocate    12 byte
list insert end
list dtor starts
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte
  my_allocator::deallocate  12 byte

===============================================
map ctor start
map ctor end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map insert start
  my_allocator::allocate    24 byte
map insert end
map dtor starts
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte
  my_allocator::deallocate  24 byte

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

@ জো ঠিক আছে, আপনার সমস্ত প্রশ্নের এক উত্তরে সম্বোধন করা শক্ত। আমি নিশ্চিত না যে আপনি "ওভারহেড" এবং তদতিরিক্ত এর তুলনায় ঠিক কী বোঝাতে চেয়েছেন? আমি ভাবলাম ওভারহেড দিয়ে আপনি বোঝাচ্ছেন মেমরির খরচ।
মাইক সেমদার

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

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

1
@ জো এখন এটি এখানে: পি আমি অন্য সাইটে এটি স্থানান্তরিত করতে খুব আগ্রহী নই, আমি ফলাফলের প্রতি কেবল আগ্রহী ছিলাম।
মাইক সেমদার

8

std::stringলিখিত অনুলিপি না। কউ একটি অপ্টিমাইজেশন হিসাবে ব্যবহৃত হত, তবে একাধিক থ্রেড ছবি প্রবেশ করার সাথে সাথে এটি একটি হতাশার বাইরে-এটি বিশাল কারণগুলির দ্বারা কোডটি ধীর করতে পারে। এটি এতটাই খারাপ যে C ++ 0x স্ট্যান্ডার্ড কার্যকরভাবে প্রয়োগের কৌশল হিসাবে নিষিদ্ধ করে। কেবল তা-ই নয়, তবে std::stringপরিবর্তনযোগ্য পুনরাবৃত্তকারী এবং চরিত্রের উল্লেখগুলি ডিশ করে দেওয়ার অনুমতি মানে std::stringহ'ল প্রায় " প্রতিটি ক্রিয়াকলাপ " লিখতে "write

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

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

std::vector<std::string> MahFunction();
int main() {
    std::vector<std::string> MahVariable;
    MahFunction().swap(MahVariable);
}

অবশ্যই, সি ++ 0 এক্সে এটি রিয়ন্ডান্ট, তবে সি ++ 03 এ যখন এটি সাধারণত ব্যবহৃত হত, যদি মাহওয়ারিবেল ঘোষণায় মেমরির বরাদ্দ দেয় তবে এটি কার্যকারিতা হ্রাস করে। আমি vectorসত্যে জানি যে এটি এমএসভিসি 9 এসটিএলে কনটেইনারগুলির দ্রুত পুনঃনির্ধারণের জন্য ব্যবহৃত হয়েছিল যা উপাদানগুলি অনুলিপি করার প্রয়োজনীয়তা সরিয়ে ফেলে।

dequeএকটি নিয়ন্ত্রণহীন লিঙ্কযুক্ত তালিকা হিসাবে উল্লেখ করা কিছু ব্যবহার করে। এটি মূলত অ্যারেগুলির একটি তালিকা, সাধারণত ইন-নোডে নির্দিষ্ট আকারের। যেমন, বেশিরভাগ ব্যবহারের জন্য, এটি উভয় ডেটা স্ট্রাকচারের সুবিধা বজায় রাখে con সংক্ষিপ্ত অ্যাক্সেস এবং মোড়কযুক্ত ও (1) অপসারণ এবং এর চেয়ে সামনের এবং পিছনে এবং আরও ভাল পুনরাবৃত্তি অবৈধকরণ উভয়ই যুক্ত করতে সক্ষম vectordequeএটি কোনও অ্যালগরিদমিক জটিলতা এবং পুনরাবৃত্তকারী অবৈধতার গ্যারান্টিযুক্ত কারণে ভেক্টর দ্বারা কখনই প্রয়োগ করা যায় না।

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


"এটি এতটাই খারাপ যে C ++ 0x স্ট্যান্ডার্ড কার্যকরভাবে প্রয়োগের কৌশল হিসাবে নিষিদ্ধ করে" " এবং তারা এটি নিষিদ্ধ করেছে কারণ পূর্ববর্তী বাস্তবায়নগুলি এটি ব্যবহার করেছিল, বা এটি ব্যবহারের চেষ্টা করেছিল। আপনি দৃশ্যত এমন এক বিশ্বে বাস করেন যেখানে প্রত্যেকে সর্বদা সর্বশেষতম প্রয়োগিত এসটিএল ব্যবহার করে থাকে is এই উত্তরটি মোটেই সহায়ক নয়।

আমিও কৌতূহল বোধ করি যে স্টাডির :: কী কী গুণাবলী আপনার মনে হয় একটি অন্তর্নিহিত অন্তর্নিহিত স্টোরেজটি আটকাতে পারে - পুনরাবৃত্তিগুলি শুরু / শেষের দিকে অপসারণের পরে কেবল বৈধ হয়, মাঝখানে বা কোনও সন্নিবেশের পরে নয়, যা খুব সহজেই কোনও ভেক্টর দিয়ে করা যায়। এবং একটি বিজ্ঞপ্তি বাফার ব্যবহার করে সমস্ত অ্যালগরিদমিক গ্যারান্টি পূরণ করা হয় - মোড়যুক্ত হে (1) সন্নিবেশ করুন এবং প্রান্তে মুছুন, ও (এন) মাঝখানে মুছুন।

3
@ জো: আমি মনে করি যে 90 এর দশকের শেষের দিক থেকে কোউ একটি খারাপ জিনিস হিসাবে চিহ্নিত হয়েছে। স্ট্রিং বাস্তবায়ন রয়েছে যা এটি ব্যবহৃত হয়েছিল - উল্লেখযোগ্যভাবে সিএসস্ট্রিং- তবে std::stringএর অর্থ এই নয় যে সময়ের সময়ের কাজটি হয়েছিল। এজন্য আপনাকে এসটিএল বাস্তবায়নে সর্বশেষতম এবং সর্বশ্রেষ্ঠ ব্যবহার করতে হবে না। msdn.microsoft.com/en-us/library/22a9t119.aspx বলেছে "যদি সামনে কোনও উপাদান an োকানো হয় তবে সমস্ত উল্লেখ বৈধ থাকবে"। বিজ্ঞপ্তিযুক্ত বাফারের সাহায্যে আপনি কীভাবে এটি প্রয়োগ করতে চান তা নিশ্চিত নন, যেহেতু এটি পূর্ণ হওয়ার পরে আপনাকে আকার পরিবর্তন করতে হবে।
ডেডএমজি


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

2

প্রশ্নটি এত বেশি নয় "দয়া করে এই তুলনাটি করুন" হিসাবে "এই তুলনার জন্য একটি উত্স কোথায়"

যদি এটি সত্যিই আপনার প্রশ্ন (যা আপনার প্রকৃত প্রশ্নের পাঠ্যে আপনি যা বলেছিলেন তা নিশ্চিতভাবে নয়) , যা 4 টি প্রশ্নে শেষ হয়েছে, যার কোনটিই জিজ্ঞাসা করছিল না কোথায় আপনি কোনও সংস্থান পেতে পারেন) তবে উত্তরটি কেবল সহজ:

একটিও নেই

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

অবশ্যই প্রোগ্রামাররা আছেন যারা এই ধরণের জিনিস সম্পর্কে যত্নশীল। তবে তারা সকলেই অনেক আগে স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার বন্ধ করে দিয়েছিল।

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


অনুমানমূলক উত্তর। সম্ভবত সত্যের জন্য +1, এটি প্রমাণ করার কোনও উপায় নেই for
মিথ্যাচারিত কাভিয়ার

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