এই উত্তরটি সংক্ষিপ্ত স্ট্রিং অপ্টিমাইজেশনের (এসএসও) একটি দুর্দান্ত উচ্চ-স্তরের ওভারভিউ দেয়। তবে আমি আরও বিশদে জানতে চাই যে এটি অনুশীলনে কীভাবে কাজ করে, বিশেষত libc ++ বাস্তবায়নে:
এসএসওর জন্য যোগ্যতার জন্য স্ট্রিংটি কত সংক্ষিপ্ত হতে হবে? এটি কি লক্ষ্য আর্কিটেকচারের উপর নির্ভর করে?
স্ট্রিং ডেটা অ্যাক্সেস করার সময় বাস্তবায়ন কীভাবে সংক্ষিপ্ত এবং দীর্ঘ স্ট্রিংয়ের মধ্যে পার্থক্য করে? এটি কি এতটা সহজ
m_size <= 16
বা এটি একটি পতাকা যা অন্য কোনও সদস্যের পরিবর্তকের অংশ? (আমি কল্পনা করি যেm_size
বা এর কিছু অংশ স্ট্রিং ডেটা সঞ্চয় করার জন্যও ব্যবহৃত হতে পারে)।
আমি এই প্রশ্নটি বিশেষত লাইবসি ++ এর জন্য জিজ্ঞাসা করেছি কারণ আমি জানি যে এটি এসএসও ব্যবহার করে, এটি এমনকি লিবিসি ++ হোম পৃষ্ঠায় উল্লেখ করা হয়েছে ।
উত্সটি দেখার পরে এখানে কিছু পর্যবেক্ষণ রয়েছে :
libc ++ স্ট্রিং ক্লাসের জন্য দুটি সামান্য ভিন্ন মেমরি লেআউটগুলির সাথে সংকলন করা যায়, এটি _LIBCPP_ALTERNATE_STRING_LAYOUT
পতাকা দ্বারা নিয়ন্ত্রিত হয় । উভয় বিন্যাসই ছোট-এন্ডিয়ান এবং বিগ-এন্ডিয়ান মেশিনগুলির মধ্যে পার্থক্য করে যা আমাদের মোট 4 টি ভিন্ন রূপ দেয়। আমি নিম্নলিখিত হিসাবে "স্বাভাবিক" লেআউট এবং লিটল-এন্ডিয়ান অনুমান করব।
আরও ধরে নিচ্ছি যে size_type
4 বাইট এবং এটি value_type
1 বাইট, এটি স্ট্রিংয়ের প্রথম 4 বাইট স্মৃতিতে দেখায়:
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
যেহেতু সংক্ষিপ্ত স্ট্রিংয়ের আকারটি উপরের 7 বিটে রয়েছে তাই এটি অ্যাক্সেস করার সময় স্থানান্তরিত হওয়া দরকার:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
একইভাবে, দীর্ঘ স্ট্রিংয়ের সক্ষমতা অর্জনকারী এবং সেটটার বিটটি __long_mask
প্রায় কাজ করতে ব্যবহার করে is_long
।
আমি এখনও আমার প্রথম প্রশ্নের উত্তর খুঁজছি, অর্থাত্ __min_cap
, বিভিন্ন আর্কিটেকচারের জন্য সংক্ষিপ্ত স্ট্রিংগুলির সক্ষমতা কী মূল্য গ্রহণ করবে ?
অন্যান্য স্ট্যান্ডার্ড গ্রন্থাগার বাস্তবায়ন
এই উত্তরটিstd::string
অন্যান্য স্ট্যান্ডার্ড গ্রন্থাগার বাস্তবায়নে মেমরি লেআউটগুলির একটি সুন্দর ওভারভিউ দেয় ।
string
হেডার এখানে , আমি এটা আউট মুহূর্তে :) খুঁজে দেখছি