2012-07-30 2 views
0

C++ 프로젝트에서 C#/cli 래퍼를 작성하므로 C#에서 호출 할 수 있습니다. C# 측에서는 많은 키/값 관리 데이터를 전달하기 위해 cli 메소드 [예를 들어 Put (String^key, String^value)]를 수백만 번 호출하고 C++ 객체에 요청하기 위해 다른 호출 [[Commit()]을 호출합니다. 데이터로 무엇인가를 할 수 있습니다. 마지막 호출까지 모든 데이터를 메모리에 보관할 수 있어야합니다. 따라서 std :: vector를 사용하고 관리되는 모든 문자열을 관리되지 않는 std :: string으로 변환하고이를 내 cli의 벡터에 보관하려고합니다. 암호.잠시 동안 관리 데이터를 메모리에 저장하고 유지

내 질문은 -이 시나리오에서 관리 데이터를 변환하는 가장 좋은 방법은 무엇입니까? 관리되지 않는 포인터를 유효하게 유지하기 위해 관리되는 데이터를 고정하면 데이터가 즉시 사용되지 않으므로 실제로는 바람직하지 않습니다 (함수 호출 직후 피닝이 범위를 벗어나면 액세스하지 못할 수도 있습니다). 또 다른 옵션은 malloc을 통해 "충분히 큰"버퍼를 할당하고 데이터를 계속 추가하는 것입니다. 다음과 같이하면됩니다. (1)은 memcpy가 뒤에 오는 pin-ptr입니다 (피닝은 한 번 범위를 벗어납니다. Put 메서드 반환) 단일 문자열^데이터를 변환/복사하는 가장 좋은 방법은? (2) 말락에 대한 전체 크기를 미리 알지 못하기 때문에 초기 malloc에서 메모리를 확장하는 가장 좋은 방법은 무엇입니까? 이 시나리오에 적합한 디자인 솔루션에 대한 포인터를 주시면 감사하겠습니다.

답변

1

데이터를 사용하기 전에 큐에 저장해야하는 경우 관리 컨테이너를 사용하는 것이 좋습니다. 당신은 두 개의 문자열을 '키'와 '값'이라고 부르며, 유일한 키입니까? 그렇다면 관리되는 Dictionary<String^, String^>을 사용하십시오. 그렇지 않은 경우 List<KeyValuePair<String^, String^>>을 사용하고 Commit()이 호출 될 때 관리되지 않는 문자열에 대한 모든 변환을 수행하십시오.

Commit()이 호출되면 모든 개별 문자열을 보유하기 위해 하나의 큰 malloc을 수행하거나 많은 개별 malloc (또는 다른 할당 메소드)을 사용하여 각 문자열을 개별적으로 변환 할 수 있습니다. 모든 경우에 적절하게 메모리를 해제하는 한 잘 작동해야합니다.

+0

글쎄, 그게 좋은 생각인데, 사실상 메모리를 두 배로 늘려야 겠지, 그렇지? 내 말은, 커밋 될 때까지 사전에 관리 된 데이터의 N 바이트를 유지 한 다음 프로세스에서 N 바이트의 다른 세트를 커밋하고 커밋 할 때 데이터를 복제하고이 관리되지 않는 복사본으로 C++ 커밋을 호출하는 것입니다. Put() 호출 당 하나의 변환을 수행하고 C# 측에서 오는 관리 데이터에 매달 리지 않고 관리되지 않는 데이터의 복사본 하나를 메모리에 보관하기를 정말로 바랬습니다. – user392005

관련 문제