c-strings에서 적절한 크기의 메모리를 할당해야합니다. 문자열 연산에서 재 할당을 피하기 위해 C# 또는 Java에서 Stringbuilder와 같은 것을 사용하거나 C에서 - 문자열에 더 많은 메모리를 할당 할 수 있습니다. 그러나 우리가 사전에 메모리 요구 사항을 모르는 경우 여전히 문제가 될 수 있습니다. 연결된 목록과 같은 구현이 있습니까? 나는 그것의 노드C-string을 연결된 목록으로 만드시겠습니까?
liststring a(4); // requested block size
a.append("hello ");
a.append("world");
// should create three nodes, 4 bytes allocated for each
// "hell" -> "o wo" -> "rld"
a.c_str(); // "hello world";
에서 C-문자열을 생성 메모리 및 방법 c_str()
블록의 목록을 할당하는 의미 또는 우리가 재 할당을 피하려는 경우 우리는 다른 접근 방식을 사용합니까? 나쁜 생각인지 설명해주세요.
c_str()을 호출 할 때 어쨌든 문자열을 인접한 메모리 버퍼에 넣어야하므로 일반적으로 처음부터 그렇게하는 것이 좋습니다. 고정 된 크기의 블록의 링크 된 목록을 사용한다는 것은 긴 문자열을 작성하는 것이 할당에서 O (n)을 소비하는 반면, 문자열의 일반적인 지수 증가 할당 전략은 O (log (n))을 소비하여 더 많은 메모리를 낭비한다는 의미입니다. –
그러나 우리가 여러 번 덧붙이고 싶고 얼마나 많은 크기인지 알지 못하는 경우에는 너무 적은 바이트 (재 할당이 필요함) 또는 너무 많은 메모리 (낭비)를 할당 할 수 있습니다. –
알고리즘은 4 배 이상의 문자열 길이를 사용하지 않도록 보장하며 각 재 할당에는 평균적으로'O (1)'시간이 소요됩니다. 버퍼의 현재 크기가'n'이고 문자열의 길이가 버퍼를 벗어나는 경우'2 * n' 크기의 버퍼를 재 할당해야합니다. 'n/4'보다 작 으면 'n/2'크기의 버퍼를 재 할당해야합니다. – citxx