#include <string>
static_assert(sizeof(std::string) != sizeof(void*), "using ref-counted string");
int
main()
{
}
Демонстрация: http://melpon.org/wandbox/permlink/P8LB79Cy6ASZlKuV
Этот тест использует внутреннюю работу всех известных реализаций std::lib std::string
и, в частности, реализации gcc.
gcc refcounted string
состоит из одного указателя на динамически выделяемую структуру, которая содержит размер, емкость, счетчик ссылок и данные строки. Скотт Мейерс делает хороший обзор строковых реализаций в Effective STL, который был точен для временных рамок 2001 года. Я полагаю (могу ошибаться), что "реализация C" в пункте 15 этой книги - это gcc std::string.
Для реализаций коротких строк (в значительной степени предписанных C++11) string
больше не может состоять из одного указателя на стек. Реализация Скотта D — это наш первый взгляд на реализацию коротких строк той эпохи. Это VS/Dinkumware string
. Сам sizeof(string)
будет содержать некоторый буфер данных для хранения строковых данных без распределения.
С помощью этой короткой программы можно понять, что делают разные реализации:
#include <iostream>
#include <string>
int
main()
{
std::string s;
std::cout << "word size is " << sizeof(void*)/sizeof(char) << '\n';
std::cout << "sizeof string is " << sizeof(s) << '\n';
std::cout << "short string buffer is " << s.capacity() << '\n';
}
Это распечатывает размер слова, обычно 4 или 8 (32 бита / 64 бита), поскольку по крайней мере одна реализация (libc++) меняет свои характеристики на этой аппаратной функции. Затем он выводит sizeof(string)
, которое будет кратно размеру слова, а затем capacity()
пустого string
, которое будет размером буфера коротких строк, если он существует.
Вот несколько неполный опрос:
gcc/libstdc++ 4.8
word size is 8
sizeof string is 8
short string buffer is 0
gcc/libstdc++ 5.2
word size is 8
sizeof string is 32
short string buffer is 15
clang/libc++ -arch i386 OS X
word size is 4
sizeof string is 12
short string buffer is 10
clang/libc++ -arch x86_64 OS X
word size is 8
sizeof string is 24
short string buffer is 22
VS-2015
word size is 4
sizeof string is 24
short string buffer is 15
В этом обзоре только gcc/libstdc++ 4.8 явно не использует оптимизацию коротких строк. И только gcc/libstdc++ 4.8 имеет sizeof(string) == 1 word
. И это фактически единственная реализация в этом обзоре, использующая подсчет ссылок.
В общем, этот тест для std::string
libstdc++ не переносим. Но по спецификации это не обязательно. Мы можем воспользоваться известной историей развития gcc в этой области. Спецификация (вопрос) говорит, что она должна работать только на gcc libstdc++.
person
Howard Hinnant
schedule
20.12.2015
std::string
нулем? Если это так, вы знаете, что он соответствует требованиям C++11 согласно C++0x FDIS 21.4.7.1/1. - person erip   schedule 20.12.2015static_assert
делать. Кроме того, в C++98/03 было бы неопределенным поведением пытаться получить доступ к символу терминатора, поэтому он может работать даже с ними. - person Nicol Bolas   schedule 20.12.2015s[0]
в этом ответе не являетсяconst
-квалифицированным. - person Puppy   schedule 20.12.2015