Преобразование и хранение управляемых данных в памяти на некоторое время

Я пишу оболочку C++/cli вокруг проекта C++, чтобы я мог вызывать его из C#. Сторона C# вызывает метод cli [скажем, Put(String^key, String^value)] миллионы раз, чтобы передать большой набор данных, управляемых ключом/значением, после чего следует еще один вызов [скажем, Commit()], чтобы запросить объект C++ что-то делать с данными. Мне нужно иметь возможность хранить все эти данные в памяти до последнего вызова, поэтому я использую std::vector и пытаюсь преобразовать все управляемые строки в неуправляемые std::string и хранить их в векторе в моем кли код.

Мой вопрос: как лучше всего преобразовать управляемые данные в этом сценарии? Закрепление управляемых данных для сохранения действительных неуправляемых указателей кажется действительно плохой идеей, поскольку данные не используются немедленно (также это не сработает, если закрепление выходит за рамки сразу после вызова функции - это приводит к нарушениям доступа). Другой вариант — выделить «достаточно большой» буфер с помощью malloc и продолжать добавлять в него данные. возвращает) лучший способ преобразовать/скопировать одиночные данные String^? (2) так как я не буду заранее знать общий размер для maloc, как лучше всего увеличить память из исходного malloc? Я был бы признателен за любой указатель на хорошее дизайнерское решение для этого сценария.


person user392005    schedule 30.07.2012    source источник


Ответы (1)


Если вам нужно поставить данные в очередь перед их использованием, я бы, вероятно, использовал для этого управляемый контейнер. Вы назвали две строки «ключ» и «значение», являются ли ключи уникальными? Если это так, используйте управляемый Dictionary<String^, String^>. Если нет, используйте List<KeyValuePair<String^, String^>> и выполняйте все преобразования в неуправляемые строки при вызове Commit().

Когда вызывается Commit(), вы можете сделать один большой malloc для хранения всех отдельных строк, или вы можете преобразовать каждую строку по отдельности, используя множество отдельных malloc (или другой метод распределения). Пока вы правильно освобождаете память во всех случаях, все должно работать нормально.

person David Yaw    schedule 31.07.2012
comment
Что ж, хотя это отличная идея, мне практически нужно удвоить память, верно? Я имею в виду, хранить N байтов управляемых данных в словаре до фиксации, а затем во время фиксации malloc другой набор N-байтов в процессе, дублировать данные и вызывать фиксацию C++ с этой неуправляемой копией, верно? Я действительно надеялся просто сделать одно преобразование для каждого вызова Put() и сохранить эту одну копию неуправляемых данных в памяти (без необходимости цепляться за управляемые данные, поступающие со стороны С#) - person user392005; 01.08.2012