2014-04-26 3 views
3

나는 다음과 같이 프로그램의 실행 시간에 루프 변수 '범위 - 경계 - 선언 및 사용의 효과를 관찰하기 위해 C++을 실험 하였다C++ 문자열 대 C# 문자열, 다른 실행 시간. 왜?

for(int i=0; i<10000000 ; ++i){ 
    string s = "HELLO THERE!"; 
} 

string s; 
for(int i=0; i<10000000 ; ++i){ 
    s = "HELLO THERE!"; 
} 

을 첫 번째 프로그램은 1 초에서 실행되는 반면 두 번째 프로그램은 250 밀리 초에서 실행됩니다. 내장 된 유형을 시도해도 상당한 차이가 발생하지 않으므로 두 언어로 문자열을 사용합니다.

나는 내 친구와이 문제를 논의 중이며 C#에서는 이런 일이 일어나지 않을 것이라고 말했다. 우리는 C#에서 이런 일이 발생하지 않았 음을 알았습니다. 범위가 한정된 문자열 선언은 프로그램 실행 시간에 영향을 미치지 않습니다.

왜 이러한 차이가 있습니까? 그것은 C++ 문자열 (나는 강력하게 tho를 의심한다) 또는 다른 것에서 나쁜 최적화입니까?

+9

C++에서 최적화 기능을 사용하지 않고이 테스트를 수행했다는 것이 확실합니다. 대부분의 C++ 컴파일러는 관찰 가능한 부작용이 없기 때문에 전체 코드 조각을 제거합니다. –

답변

6

C#의 문자열은 변경할 수 없으므로 할당을 통해 참조를 복사 할 수 있습니다. 그러나 C++에서는 문자열을 변경할 수 있으므로 문자열의 전체 내용을 복사해야합니다.

이 가설을 검증하려면 더 긴 문자열 상수를 사용하십시오. C++의 런타임은 올라가지만 C#의 런타임은 동일하게 유지되어야합니다.

+4

맞아요, C++에서 상응하는 것은'const char * s;를 사용하는 것입니다. –

1

C#의 문자열은 변경할 수 없습니다. C#은 참조를 사용하고 복사되지 않은 메모리를 사용합니다!

in C# "HELLO THERE!" 자동으로 메모리에 할당되고 때마다 복사되지 않습니다. 예 :

문자열 a = "HELLO"; 문자열 b = a;

그들은 같은 메모리 조각을 가리키고 있지만 C++에서는 그렇지 않습니다! 똑같지 만 같은 장소에 있지 않은 문자열은 포인터 (또는 스마트 포인터)를 사용해야하는 것과 같은 결과를 얻고 싶다면

문자열 * a = 새 문자열 ("hello"); 문자열 * b = a;