![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
bcb6_compiler_option.PNG
19.2KB
gossip아닌데..
이정구님말씀처럼.. C++Builder에서 에러가 나지 않는데요 그로인해 여러가지 문제가 발생할수 있다는것 입니다. 그걸 얘기하려구 낸 문제입니다. ------------------------------------------------------------ SongShinYoung님 ! 알고리즘 퀴즈 2문제를 제외하고는 모두 vcl또는 C++Builder의 특징에 대해 잘 모르는 부분을 단지 퀴즈 형식을 빌어서 얘기하고자 한것입니다. 문제를 푸는데 목적이 있는게 아니라 문제속에 있는 어떤 원리를 얘기하고자 하는것에 목적이 있습니다. 이건 C/C++에서 예로부터 다뤄온 문제인데
char *str = "hallo"; 때, hallo는 코드영역 뒤의 데이타 영역에 놓입니다. 물론 수정 가능하고요. 그렇기 때문에 그 영역을 한번 수정해 놓으면 다음번 char *str = "hallo"; 시에도 수정된 값을 가지게 되어 있으며 이건 C/C++의 기본 세팅입니다. 단지 컴파일러에서 스트링 영역 사용을 효율성을 위해 컴파일러 옵션에 Merge Duplicate Strings 옵션을 둘 뿐인데, 이 옵션은 켜는 것은 좋지 못한 결과만을 초래하기 때문에 켜지 않는게 좋죠. 이건 그냥 과거의 메모리 부족할때 메모리 몇 바이트 아껴보자고 만든 옵션이닌까요. 이건 위에 문제를 낸 코드의 문제가 아니고 C/C++에서 다루고 있는 정적 데이타 영역에 대한 이해에 관한 것이 본질이겠군요. 코드는 전혀 하자가 없습니다. 프로그래밍 할때 전혀 신경 쓰지 않아도 됩니다. 단지 Merge Duplicate Strings의 의미만 안다면. C++Builder 에서 테스트해 보지 않고 답글을 달아서 의미의 혼돈을 가져 온 점 죄송합니다.
static 영역의 데이터를 바꾸면 골치 아픈 일이 많아 지기 때문에 80386 이상에서부터는 특정 메모리 영역의 read/write access 권한을 줄 수가 있다는 것을 이용할 줄 알았는데 컴파일러에 따라서 이런 권한 설정이 조금씩 다른 것 같습니다. 테스트를 해 보았는데 CBuilder에서는 static data 영역의 write가 가능하고 MSVC에서는 방지해 놓은 것 같습니다. 테스트 코드는 다음에서... http://www.gilgil.net/3643 원래는 char *str = "hallo"; 의 hallo 영역을 수정할 수 있는 것이
C/C++의 기본세팅이고, 볼랜드에서는 이 규칙을 지금까지 지켜왔습니다. 반면 VC쪽은 윈도 프로그래밍으로 넘어 오면서 char *str의 포인트와 char str[] 배열에 대한 구분을 시작했으며 볼랜드와 달리 데이타를 놓는 위치도 틀립니다. 볼랜드는 원래대로 데이타 영역를 놓고, 수정할 수 있으며 VC쪽은 리소스와 문자열을 마찬가지로 수정할 수 없는 영역에 놓고 이를 배열의 경우는 복사해서 동적데이타 영역에 쓰는 방식을 취하고 있습니다. 재미있는 것은 VC쪽은 char *str = "hallo";의 hallo에 대한 데이타 수정을 막고 있지만, 릴리즈 버전에서는 전혀 에러를 내지 않는 어정쩡한 입장을 취하고 있습니다. 오랫동안 잊고 있다가 말이 나와서 한번 체크해봤습니다. 원래는 어셈블리 컴파일 되었을때의 각각의 데이타 섹션도 알았는데... 기억이 다소 희미해져서... 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
쿨럭.... ㄴ(^-^;)ㄱ@@@