Чтение и запись в буфер - PullRequest
0 голосов
/ 11 мая 2009

У меня есть 2 класса, один, который записывает несколько 96-битных объектов в буфер (32 бита за раз - 3x int32), и один, который я хочу прочитать из того же буфера.

Первый класс (Writer) резервирует и область памяти и создает указатель на первую 32-битную область.

  1. Как мне безопасно записать в буфер (игнорируя переполнение буфера на данный момент) ... Мне нужно писать в 32-битных чанках, так как мне изменить положение «указателя записи» между каждой 96-битной записью? Должен ли я сделать что-то вроде:

    for(int count = 0; count < 100; ++count)  // for 100 96bit objects
    {
        for(int32 i = 0; i < 3; ++i)
        {
            *buffer = *(myInt32 + i);
        }
        // ** how do I move the buffer ptr to the start of the next 96bit memory space? **
    }
    
  2. Безопасно ли для меня зарезервировать память, записать число 96-битных объектов, а затем передать указатель на начало второго класса (Reader), чтобы они оба имели доступ к одному и тому же объекту? объекты? (Считыватель будет считывать кратные 96-битные объекты за один раз (~ 10000), поэтому мне нужно знать только начало данных для чтения.)

  3. Как только считыватель прочитает буфер, как мне «сбросить» указатель (очистить буфер), чтобы я мог снова записать в буфер?

Буфер: Буфер на самом деле является указателем на начало области памяти, зарезервированной posix_memalign.

int32 *tempbufferPtr; 
posix_memalign ((void**)&tempbufferPtr, 8, 10000 ); // space for 10,000 objects 
writePtr = (my96bitObjectclass*)tempbufferPtr;

Ответы [ 3 ]

3 голосов
/ 11 мая 2009

Просто используйте арифметику указателя, она увеличится на нужную величину (на размер объекта, на который указывает указатель).

int32 *ptr = ...;

*ptr++ = 1;
*ptr++ = 2;
*ptr++ = 3;

// Here, ptr has been advanced by 3 times 32 bits, and is pointing at the next location.
2 голосов
/ 11 мая 2009

Просто увеличьте указатель буфера. Это должно работать:

for(int count = 0; count < 100; ++count)  // for 100 96bit objects
{
    for(int32 i = 0; i < 3; ++i)
    {
        *buffer++ = *(myInt32 + i);
    }
}
0 голосов
/ 11 мая 2009

Расширение указателя на идею раскручивания:

typedef struct {
    int a; int b; int c;
} myobj_t;

// allocate some memory
myobj_t *myobj_p, *myobj = malloc( ... );

myobj_p = myobj;  // don't want a memory leak
while ( ... ) {
myobj.a = x;
myobj.b = y;
myobj.c = z;

myobj++;
}
...