Std::string из const char* с нулевым распределением

При объявлении std::string cpp{}; вызывается ли это new/malloc?

Предположим, у нас уже есть const char* c. Можно ли переместить содержимое из c в cpp без дополнительных выделений?

Да. Копия создается из исходной строки. Используйте std::string_view, чтобы сделать это без динамического выделения. Нет, вы не можете ничего двигать. Исходная строка существует в доступной только для чтения части памяти вашей программы на протяжении всего времени ее существования. Это нормально.

Dúthomhas 19.08.2024 01:52

@Dúthomhas Спасибо! Не уверен, что вы подразумеваете под нормальным, но думаю, это ответ на мой вопрос. Я бы подумал, что const_cast + строка из char*&& должна работать, но все в порядке. Еще раз спасибо!

SpeakX 19.08.2024 01:56

Обычно данные инициализации хранятся в месте образа вашей программы, доступном только для чтения, и копируются только при инициализации переменных, независимо от времени жизни переменной. Обычно это не влечет за собой каких-либо существенных ограничений на использование оперативной памяти вашей программы.

Dúthomhas 19.08.2024 02:39

@SpeakX это вызывает new/malloc? -- Нет, для большинства компиляторов память вообще не выделяется. Фактически, если строка короткая, память не выделяется. См. Оптимизация малых строк (SSO).

PaulMcKenzie 19.08.2024 04:24

@Dúthomhas «Исходная строка существует в доступной только для чтения части памяти вашей программы на протяжении всего срока службы вашей программы» - в вопросе или комментариях нет ничего, что могло бы предположить, что рассматриваемый указатель const char* указывает на память только для чтения, например строковый литерал. Существует множество законных причин, по которым существует константный указатель на изменяемую память. Недостаточно контекста, чтобы сделать ваше предположение

Remy Lebeau 19.08.2024 04:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При объявлении 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. Таким образом, даже если бы реализация попыталась выполнить в нем динамическое выделение, она всегда должна была бы иметь запасную стратегию, поскольку ей не разрешено распространять исключение выделения.

user17732522 19.08.2024 06:36

Другие вопросы по теме