По существу, объект std::string
- это не что иное, как указатель на фактические строковые данные 1 и некоторую информацию о строке, которую он переносит (например, ее текущую длину). Могут быть и другие специфичные для реализации данные, которые увеличивают это число.
И чтобы понять размер строковых литералов, таких как "n"
, вам необходимо понимать, что все строковые литералы в C ++ действительно являются массивами постоянных символов, в том числе символ конца строки. Например, "n"
- это массив из двух символов: символ 'n'
и терминатор строки '\0'
.
Это означает, что ваше утверждение, что sizeof "//n"
- это три байта, неверно, это действительно четыре байта. .
Наконец, размер массива - это общий размер массива. Другими словами, размер каждого элемента умножается на количество элементов.
1 Хотя это "классический" вид std::string
, это не всегда так, посколькучасто то, что называется оптимизация короткой строки , где короткая строка может быть полностью сохранена внутри самого объекта std::string
. Там нет стандартизированного предела, который определяет «короткую строку», и это действительно детали реализации.