나는 내가 만든 알고리즘을 구현하는 암호화 응용 프로그램을 만들고 있습니다. 저는 C에서 약 1 년간의 경험과 C++에서 6 개월의 경험을 가지고 있습니다. 그러나 Visual Basic과 Gambas에서 6 년의 경력을 쌓았습니다. (그리고 저는 빨리 배우기를 바랍니다.) 가능한 한 효율적으로 새 응용 프로그램을 만들고 싶습니다. 그게 내가 C++ 대신 C를 집어 들게 한 이유입니다. (나는 저수준 언어를 사용하고 싶었습니다.)자유롭게 정의 된 문자열 상수
내 프로그램에서 정의 된 문자열 상수를 사용하여 오류 메시지를 처리하고 있습니다. 전 처리기가 매번 매크로 이름을 실제 문자열로 대체한다는 것을 알고 있습니다. 실수가 아니라면 문자열 상수를 미리 할당하고 모든 발생에 대해 다른 포인터를 반환한다는 의미입니다. 모든 문자열 포인터를 해제해야합니까? 실제로 그것은 약간 이상하게 보입니다 ... 포인터는 자동 변수와 같습니다 (범위에서 벗어날 때 해제된다는 의미입니다) 또는 영원히 상수로 머물러 있습니까?
나는 messages.h와 같은 전용 헤더 파일을 사용하는데,이 헤더 파일에는 프로그램이 사용할 수있는 모든 가능한 오류 메시지의 정의가 들어있어 언어 등을보다 쉽게 변경할 수 있습니다. 따라서 문자열 상수로 직접 쓸 수는 없습니다. 나는 그것들을 상수 변수로 선언 할 생각을 했었지만 실제 값을 가진 C 파일을 사용해야하고 헤더 버전을 extern으로 선언하거나 모든 상수를 messages.h 헤더를 포함하는 모든 파일 안에 다시 선언해야한다. 저를 믿으십시오, 나는 그 프로젝트를 구성하는 20 개 이상의 파일을 가지고 있으며, 약 50-100 개의 메시지와 함께 프롬프트 메시지 인 — 약 30 개의 긴 메시지가 —이므로 상당한 메모리를 소비 할 것입니다.
무엇을 제안합니까? — 및 더 중요한 것은 내가 — 상수 포인터를 무료로 할 수 있습니까?
사전 처리 된 소스에서 문자열 리터럴로 표시되는 경우 동적으로 할당되지 않았기 때문에이를 해제 할 필요가 없습니다 (실제로는 해제하지 않는 모든 이유). –
그리고 동일한 긴 문자열 매크로의 많은 인스턴스가 누적되면서 메모리를 사용하지 않습니까? – someone
매크로가 사용 된 경우에만 매크로 세그먼트가 데이터 세그먼트가 아닌 텍스트 세그먼트에 있습니다. 메시지를 '정의'하는 데 사용하는 양식에 따라 다릅니다. 헤더가'static const char message1 [] = "blah";를 헤더에 쓰면 공간을 낭비하게됩니다. '#define message1 "blah"'라고 말하면, 그 공간이 사용될 때만 공간이 생깁니다. 헤더에'extern const char message1 [];'이라고 쓰면 변수에 정의 된 (선언하는 것과 반대되는) 파일에 각 문자열의 복사본 하나만 있습니다. –