При объявлении std::string cpp{}; вызывается ли это new/malloc?
Предположим, у нас уже есть const char* c. Можно ли переместить содержимое из c в cpp без дополнительных выделений?
@Dúthomhas Спасибо! Не уверен, что вы подразумеваете под нормальным, но думаю, это ответ на мой вопрос. Я бы подумал, что const_cast + строка из char*&& должна работать, но все в порядке. Еще раз спасибо!
Обычно данные инициализации хранятся в месте образа вашей программы, доступном только для чтения, и копируются только при инициализации переменных, независимо от времени жизни переменной. Обычно это не влечет за собой каких-либо существенных ограничений на использование оперативной памяти вашей программы.
@SpeakX это вызывает new/malloc? -- Нет, для большинства компиляторов память вообще не выделяется. Фактически, если строка короткая, память не выделяется. См. Оптимизация малых строк (SSO).
@Dúthomhas «Исходная строка существует в доступной только для чтения части памяти вашей программы на протяжении всего срока службы вашей программы» - в вопросе или комментариях нет ничего, что могло бы предположить, что рассматриваемый указатель const char* указывает на память только для чтения, например строковый литерал. Существует множество законных причин, по которым существует константный указатель на изменяемую память. Недостаточно контекста, чтобы сделать ваше предположение





При объявлении
std::string cpp{};вызывается ли этоnew/malloc?
Это зависит от конкретной реализации std::string, но, скорее всего, нет. Ничто не мешает реализации динамически предоставлять значение по умолчанию capacity, но, как и большинство вещей в C++, вы не платите за то, что вам не нужно, поэтому они, скорее всего, не будут предварительно выделять динамическую память для строки, созданной по умолчанию. Особенно, если реализована оптимизация коротких строк (SSO).
Предположим, у нас уже есть
const char* c. Можно ли переместить содержимое изcвcppбез дополнительных выделений?
Двигайся, никогда. std::string может двигаться только от другого std::string объекта.
В случае const char*, std::string всегда копирует символы в свою память.
Будет ли эта копия выделять память динамически, зависит от двух факторов:
независимо от того, реализует ли std::string единый вход. Сегодня большинство продавцов так и делают.
помещается ли содержимое const char * полностью в буфер SSO, если оно реализовано.
Если оба условия верны, то память не выделяется динамически. В противном случае память выделяется динамически.
Поскольку в C++17 конструктор по умолчанию std::string также отмечен noexcept. Таким образом, даже если бы реализация попыталась выполнить в нем динамическое выделение, она всегда должна была бы иметь запасную стратегию, поскольку ей не разрешено распространять исключение выделения.
Да. Копия создается из исходной строки. Используйте
std::string_view, чтобы сделать это без динамического выделения. Нет, вы не можете ничего двигать. Исходная строка существует в доступной только для чтения части памяти вашей программы на протяжении всего времени ее существования. Это нормально.