std::string
не робить копію під час запису. Корова була раніше оптимізацією, але як тільки декілька потоків увійде в малюнок, це поза песимізацією - це може сповільнити код за рахунок масивних факторів. Це так погано, що стандарт C ++ 0x активно забороняє це як стратегію реалізації. Не тільки це, але вседозволеність std::string
вимикання змінних ітераторів та посилань символів означає, що "писати" для цього std::string
тягне за собою майже кожну операцію.
Оптимізація коротких рядків - це приблизно 6 символів, я вважаю, чи щось у цьому регіоні. Мотузки заборонені - вони std::string
повинні зберігати суміжну пам'ять для c_str()
функції. Технічно ви могли підтримувати як суміжну струну, так і мотузку в одному класі, але ніхто ніколи цього не робив. Більше того, з моїх відомостей про мотузки, зробити їх безпечними для маніпуляцій з нитками було б неймовірно повільно - можливо, так само погано або гірше, ніж корова.
Жоден контейнер не здійснює розподілення пам'яті, оголошуючись у сучасних STL. Контейнери на основі вузлів, такі як список і карта, як раніше, але тепер у них є вбудована кінцева оптимізація і не потрібна. Це звичайно проводити оптимізацію під назвою "swaptimization", де ви обмінюєтесь порожнім контейнером. Поміркуйте:
std::vector<std::string> MahFunction();
int main() {
std::vector<std::string> MahVariable;
MahFunction().swap(MahVariable);
}
Звичайно, в C ++ 0x це зайве, але в C ++ 03 тоді, коли це було загальновживаним, якщо MahVariable виділяє пам'ять на декларування, то це знижує ефективність. Я знаю на факт, що це було використано для більш швидкого перерозподілу контейнерів, як vector
у MSVC9 STL, який усунув необхідність копіювання елементів.
deque
використовує щось, про яке йдеться у списку непрокрученого зв’язку. Це в основному список масивів, як правило, у вузлі фіксованого розміру. Таким чином, для більшості застосувань він зберігає переваги обох структур даних - безперервного доступу та амортизованого видалення O (1) та можливість додавання як передньої, так і задньої та кращої відключення ітератора, ніж vector
. deque
ніколи не може бути реалізований вектором через його алгоритмічну складність та гарантії відключення ітератора.
Скільки пов'язано накладних витрат на пам'ять? Ну, чесно кажучи, це трохи негідне запитання. Контейнери STL розроблені так, щоб вони були ефективними, і якби ви повторювали їх функціональність, ви б або закінчилися чимось гіршим, або знову на тому ж місці. Знаючи їх основні структури даних, ви можете знати накладні витрати на пам'ять, які вони використовують, віддають або беруть, і це буде лише більше, ніж з поважної причини, наприклад, невеликої оптимізації рядків.
deque
завжди було реалізовано в STL з вектором.