Re: #pragma pack(push,1) - как сделать в С#?
От: vdimas Россия  
Дата: 04.11.08 05:19
Оценка:
Здравствуйте, vog, Вы писали:

vog>Как бы мне эти алигменты указать в C#? Массив таких структур записан в файле, я хочу использовать

vog>FileMapping и читать, как массив структур, наверное, без указания алигмента не обойтись?

А смысл делать FileMapping, если тебе для прочтения любого поля будет маршаллиться т.е. долго и нудно копироваться вся структура, да еще и через рефлексию? Автоматический маршаллинг убъет нафик любой выигрыш от FileMapping.

Сделай обертку типа такого:
unsafe struct RateInfo
{
    private byte* _addr;
    
    public RateInfo(IntPtr addr) {
        _addr = addr.ToPointer();
    }
    
    uint Ctm { get { return *(uint*)_addr; } }
    double Open { get { return *(double*)(_addr+4); } }
    double Low { get { return *(double*)(_addr+12); } }
    ...
}


Структура хранит адрес элемента, с которым работаешь, а в св-вах ручками пишем код, который нам нарисовал бы какой-нить C++/CLI-компилятор при обращении к полям твоей исходной структуры, т.е. будет работать с нативной скоростью без проседания быстродействия в сотню раз на маршаллинге.

Идеально было бы сделать это всё не ручками, а создать вспомогательную либу именно в упомянутом C++/CLI, дабы сохранить принцип реализации, но убрать нелицеприятный хардкод.

Принцип там будет примерно такой:
#pragma unmanaged
#pragma (push, пиф, паф и что угодно из С++)

struct NativeRateInfo {
    unsigned ctm;
    ...
};

#pragma managed

public value class RateInfo {
    NativeRateInfo* ptr;
    
public:
    RateInfo(NativeRateInfo* p) : ptr(p) {}

    // :)
    void Next() { ptr++; } 
    
    unsigned Ctm { unsigned get() { return ptr.ctm; } }
    ...
};
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.