Przecież w stringu dane masz ułożone jak w zwykłej tablicy i w wektorze, czyli ciągle, a nie jak w liście, kolejce, mapie i innych kontenerach. Oczywiście, że można skopiować za pomocą tamtych funkcji.
Oczywiście, że nie. To wszystko jest zależne od implementacji, standard nic o tym nie mówi. libstdc++ np. używa mechanizmu copy on write.
Za pomocą memcpy
można bezpiecznie kopiować tylko obiekty, dla których std::is_trivially_copyable
będzie true.
Chyba nie ma jeszcze implementacji biblioteki standardowej, która ma wszystkie te szablony z <type_traits>
, ale GCC ma wbudowane mechanizmy do sprawdzania takich rzeczy:
#include <iostream>
#include <string>
int main() {
std::cout << __has_trivial_copy(std::string) << '\n';
return 0;
}
Wynik:
endrju@kormoran smieciki % ./a.out
0
Jak widać nie, nie można kopiować std::string
za pomocą memcpy
.
Tutaj przykład co się dzieje, kiedy się tak zrobi: http://ideone.com/XJJLt Na ideone w ogóle nie działa a u mnie jest tak:
endrju@kormoran smieciki % ./a.out
tab1 przed:
ala ma kota
ala ma kota
ala ma kota
tab1 po:
kot ma aids
kot ma aids
kot ma aids
tab2 przed usunieciem tab1:
kot ma aids
kot ma aids
kot ma aids
kot ma aids
kot ma aids
tab2 po usunieciu tab1:
kot ma aids1��
����kot ma aids1
����kot ma aidsAX�����(�X�1
kot ma aids1
kot ma aids�%
Z std::copy
działa prawidłowo. Jak widać kopiowanie za pomocą memcpy
powoduje, że oryginał jest zmieniony po operacji na "kopii" a po jego usunięciu dzieją się cuda.