문제

문자열 불변성은 진술 또는 진술 내 문자열에 의해 작동합니까?

예를 들어, 다음 코드는 힙에 두 줄을 할당한다는 것을 이해합니다.

string s = "hello ";
s += "world!";

"안녕하세요"는 쓰레기가 수집 될 때까지 힙에 남아있을 것입니다. 그리고 S는 이제 "Hello World!" 힙에. 그러나 다음 선은 힙에 몇 개의 문자열을 할당합니까? 또한 결과를 확인하는 도구/방법이 있습니까?

string s = "goodbye " + "cruel world!";
도움이 되었습니까?

해결책

컴파일러는 문자열 연결에 대한 특별한 처리를 가지고 있기 때문에 두 번째 예제는 그 이유입니다. 하나 끈. 그리고 "Interning"이란이 라인을 200000 번 실행하더라도 여전히 1 개의 문자열이 있음을 의미합니다.

결과를 다시 테스트 ... 가장 쉬운 방법 (이 경우)은 아마도 반사기를 보는 것일 것입니다.

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

보시다시피 (ldstr), 컴파일러가 이미 당신을 위해 이것을했습니다.

다른 팁

문자 그대로 인턴 이것은 그것을 의미합니다 "hello " 하다 ~ 아니다 힙에 존재하지만 데이터 세그먼트에 있습니다 의견 참조 Progam (따라서 쓰레기 수집 자격이 없음)의 경우 "world", "hello world" 컴파일러가 충분히 똑똑하다면 그것은 또한 인턴 될 수 있습니다.

"goodbye cruel world" ~ 할 것이다 문자열 리터럴 연결은 컴파일러가 취급 한 것이기 때문에 인턴을 사용하십시오.


편집하다: 데이터 세그먼트 문에 대해 잘 모르겠습니다. 이 질문 자세한 내용은.

실제로, 아마도 3. "Goodbye"의 const 줄, "Cruel World"의 const 줄, 그리고 결과를위한 새로운 문자열입니다.

생성 된 코드를 살펴보면 확실히 알 수 있습니다. 그것은 컴파일러에 따라 다르지만 (실제로는 언어에 따라, 이것은 명백하지 않습니다) -a 플래그를 사용하여 G ++의 출력을 읽을 수 있습니다. .

문자열에 대해 "알고있는"것을 믿지 마십시오. 문자열 구현을 위해 소스 코드를 살펴볼 수 있습니다. 예를 들어 예제 :

string s = "goodbye " + "cruel world!";

Java에서는 단일 문자열을 할당합니다. Java는 꽤 귀여운 트릭을 연주하고 제외하기가 어려울 것입니다. 필요할 때까지 결코 최적화하지 마십시오!

그러나 현재 내가 아는 한 : 이것을 사용합니다.

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

1000 공간 문자열을 만들려면 여전히 비효율적 인 경향이 있습니다.

루프에서 추가되는 것은 꽤 나쁘지만 그렇지 않으면 StringBuilder만큼 효율적일 것입니다.

컴파일 시간에 문자열 값이 알려질 때 컴파일러가 매우 다른 최적화를 만들 수 있기 때문에 여기에서주의하십시오. 사용중인 문자열이 런타임까지 알려지지 않은 경우 (구성 파일, 데이터베이스 또는 사용자 입력에서 가져 오면) 매우 다른 IL이 표시됩니다.

당신이 단지 하나 또는 두 개의 문자열 연결을하려고한다면 나는 그것에 대해 걱정하지 않을 것입니다.

그러나 동의가 많거나 루프가 있다면 예방 조치를 취하고 싶습니다. Java 세계에서는 Stringbuffer를 사용하여 문자열을 연결하는 것입니다.

한 줄만이 아닌 경우, 첫 번째 문자열을 StringBuffer로 만들고, 연결을 수행하고, 결과 문자열을 반환함으로써 두 줄의 연결을 달성 할 수 있습니다.

StringBuffer를 직접 만드는 것은 과잉처럼 보일 수 있지만 어쨌든 일어날 일입니다 .-

반드시 조기에 최적화하지는 않지만 성능이 저조한 문자열 컨 컨트레이션이 얼마나 나쁜지 할인하지 마십시오. 그것은 객체 생성이 아니라 GC가 일으키는 일입니다.

실험실이 있습니다 (ASP.NET 에스컬레이션 엔지니어) 테스 페르르 난데스 쇼는 (다소 극단적이고 부여 된) 예입니다. 현악이 서버를 무릎으로 가져올 수있는 방법.

컴파일러가 "지능적"이라면 "Goodbye Cruel World!"가있는 하나의 끈 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top