Преобразуйте из C++ / указатель CLI на собственный указатель C++

Если Вы собираетесь быть операциями выполнения на большой матрице изображений, Вы могли бы хотеть полагать, что техника назвала "мозаичное размещение". Идея состоит в том, чтобы обычно загружать изображение в памяти так, чтобы тот же непрерывный блок байтов не содержал бы пиксели в одной строке, а скорее квадрата в 2D пространстве. Объяснение позади этого - то, что Вы сделали бы больше операций, которые ближе друг к другу в 2D, а не на одной строке развертки.

Это не собирается уменьшать Ваше использование памяти, но может оказать огромное влияние на свопинг страницы и производительность.

15
задан Deduplicator 13 December 2014 в 05:25
поделиться

3 ответа

Я считаю, что вам нужно пометить указатель как «закрепленный» (в управляемом коде), а затем скопировать байты в некоторую неуправляемую область памяти, а затем использовать указатель на нее. Например, вот фрагмент кода, который я когда-то где-то нашел, который преобразует указатель на управляемый System :: String в неуправляемый std :: string в кодировке UTF-8:

std::string managedStringToStlString( System::String ^s )
{
    Encoding ^u8 = Encoding::UTF8;
    array<unsigned char> ^bytes = u8->GetBytes( s );
    pin_ptr<unsigned char> pinnedPtr = &bytes[0];
    return string( (char*)pinnedPtr );
}

Обратите внимание, как мне нужно получить 'закрепленный' указатель на массив байтов , возвращаемый функцией GetBytes () , а затем приведите его к char * перед передачей его в std :: string конструктор. Я считаю, что это необходимо для того, чтобы подсистема управляемой памяти не перемещала массив байтов в памяти, пока я копирую байты в строку STL.

В вашем случае,

11
ответ дан 1 December 2019 в 03:52
поделиться

Я довольно давно использовал C ++ / CLI, но думаю, вам нужно закрепить указатель.

4
ответ дан 1 December 2019 в 03:52
поделиться

Ожидается ли, что указанная память будет действительна после вызова CoCreateInstance ()?

Как упоминали Фрерих и Ахим, вы можете получить необработанный указатель на память, не опасаясь перемещаемую память, "закрепляя" ее и получая внутренний указатель. Обычно это делается с помощью шаблона pin_ptr (см. Пример в сообщении Frerich).

Однако pin_ptr намеренно можно использовать только в стеке. Вы не можете использовать его как переменную-член или глобальную переменную, и вы не можете передать его как аргумент или возвращаемое значение. Память открепляется, когда выходит из области видимости.

Так что, если требуется, чтобы память была действительной только во время вызова CoCreateInstance (), тогда можно использовать pin_ptr. В противном случае вам нужно будет сделать копию памяти и передать , что в CoCreateInstance ()

4
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: