Я тут вознамерился переписать парочку стандартных контейнеров джаст фо лулз и встретил некоторые непонятности
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <stdio.h>
int main() {
std::cout << sizeof(std::string) << std::endl;
std::string s0;
std::cout << sizeof(s0.c_str()) << std::endl;
std::cout << sizeof(std::vector<char>) << std::endl;
std::string s1 = "";
printf("%p\n", &s1[0]);
printf("%ld\n", s1.capacity());
char s2[] = "_lol ololololo";
int s2_l = std::strlen(s2);
for (int i = 0; i < s2_l; i++) {
s1.push_back(s2[i]);
printf("%p\n", &s1[0]);
printf("%ld\n", s1.capacity());
}
printf("%ld, %ld\n", s1.max_size(), sizeof(s1.max_size()));
std::string s3 ("ol\0lo", 5);
std::cout << s3 << std::endl;
//s1 += s2;
//printf("%p\n", s1.c_str());
}
1) почему размер std::string равен размеру указателя (8 байт в 64-битной системе), вроде ж в нем должен храниться указатель на байты и размер строки или нет? (в строке могут быть нулевые символы, без размера никак; где бы глянуть сорцы gcc'шного std::string?...)
2) отчего вектор чаров аж 24 байта занимает? по логике вещей ему должно хватать указателя на то что хранит (в данном примере байты) и длина вектора
3) изменение размера контейнеров делается realloc'ом (какбы после добавления чего-то в конец указатель не всегда меняется) или хитрой манипуляцией с new/delete?
4) чтобы запихнуть в std::string нулевые символы приходится еще длину строки передавать, как ее программно считать? strlen же до первого нулевого определит