2016-11-04 3 views
0

C++ 프로그램에서 상수 데이터가 저장되는 위치, 특히 문자열 상수는 어디입니까?문자열 상수는 메모리에 어디에 저장됩니까?

나는 다음과 같은 질문에 있기 때문에 요구하고있다 :

Why can creating a static const std::string cause an exception?

데이먼에 의해 대답을의 끝에 다음이 있습니다

string_view 것, 문자열에 반대하지 할당량이 일정하지 않은 메모리를 할당하고 상수 데이터를 복사 한 다음 일정하다고 가정합니다. 대신 상수 데이터에 직접 포인터를 관리하고 입니다.

그런 식으로, 당신의 상수는 (정식 적으로뿐만 아니라) 상수 일뿐입니다. 은 할당이없고, 예외가 없으며, 이중 메모리가 없습니다 사용법입니다. 그리고 대부분은 여전히 ​​보이며 끈처럼 냄새가납니다. string_view가이 null 종료를 보장하지 않는다는 점이 주목할만한 차이점입니다 (그러나 문자 상수는 을 가리킴). 이는 실제로는 상수라는 사실입니다. 은 수정할 수 없습니다 ... 이는 정확히 당신이 원하는.

심지어 상수는 메모리에 저장해야합니까? 그리고 그들이 메모리에 저장되어 있다면 (메모리가 유한이기 때문에) 더 이상의 메모리가 없으므로 예외가 발생할 수 있습니까?

+2

코드가 실행되기 전에 메모리가로드됩니다. 따라서 런타임 예외는 없습니다. 실행할 수 있으면 메모리가 이미 있습니다. –

+1

관련 http://stackoverflow.com/questions/349025/is-a-string-literal-in-c-created-in-static-memory https://isocpp.org/wiki/faq/ctors#static- 초기화 명령 –

답변

2

문제는 일반 데이터가 아니라 std::string이 개체라는 것입니다.

static const std::string foobar = "foobar"; 

를 선언 할 때 이진 예약 된 정적 데이터 (a const char* 마련) 리터럴 "foobar"위한 하나와 std::string 객체를 저장하기 위해 필요한 공간을 의미한다 내용을 저장하는 데 필요한 공간은 이 아니며입니다.

은의이 코드의 사소한 안전하지 않은 작품이지만 당신에게 아이디어를주고 그냥

class string { 
private: 
    size_t length; 
    char* data; 

public: 
    string(const char* data) : length(strlen(data), data(new char[length+1]) { 
    strcpy(this->data, data); 
    } 
    ~string() { delete data; } 
}; 

가정 해 봅시다, 같은 같은 std::string을 상상해보십시오. static std::string을 가지고있을 때는 데이터 자체가 힙에 동적으로 할당되기 때문에 필요한 유일한 공간은 sizeof(char*)+sizeof(size_t) 바이트입니다.

static const std::string을 사용하면 문자의 생성자에 전달되는 리터럴 자체와 std::string에 대해 두 배의 공간이 낭비되는 것입니다.

이제이 개체는 컴파일 타임에 "사전 구성되지"않았습니다. 이것은 런타임에 생성되고 정확히 doesn't guarantee 표준이 발생하면 실제로 발생합니다 (실제로 발생하면 main을 호출하기 전에 생성자가 throw 할 수있는 예외를 포착 할 수 없습니다).

string_view는 그것을 변경할 수 있도록 설계 정상 std::string위한 경우가 아니라 콘텐츠 만 포인터를 저장 폐기물로서 메모리를 넣은 사람은 아니다 const char* 래퍼이다 인용.

1

정적 상수는 실행 파일의 '데이터'세그먼트에 저장됩니다. 정확히 어디에 저장되어 있는지는 시스템마다 다를 수 있지만, 예를 들어 Linux의 경우 실행 파일의 일부로로드되고 프로세스 메모리 맵의 '텍스트 세그먼트'바로 위에 나타납니다.

이들은 프로그램이 실행되기 전에 운영 체제에 의해 프로세스 메모리 맵에로드됩니다. 따라서 메모리가 충분하지 않으면 프로그램을로드 할 수 없으며 예외를 throw 할 확률이 훨씬 적습니다.

프로세스의 메모리 레이아웃에 관심이 있으시면 this blog post이 가장 유용하다는 것을 알았습니다.

관련 문제