Буферы разделяемой памяти в C ++ без нарушения строгих правил наложения имен

Я борюсь с реализацией буфера общей памяти, не ломая C99 'строгие правила псевдонимов.



Предположим, у меня есть некоторый код, который обрабатывает некоторые данные и должен иметь некоторыеЦарапина» память для работы. Я мог бы написать это как-то так:

void foo(... some arguments here ...) {
  int* scratchMem = new int[1000];   // Allocate.
  // Do stuff...
  delete[] scratchMem;  // Free.
}

Затем у меня есть другая функция, которая делает некоторые другие вещи, которые также нуждаются в чистом буфере:

void bar(...arguments...) {
  float* scratchMem = new float[1000];   // Allocate.
  // Do other stuff...
  delete[] scratchMem;  // Free.
}

Проблема заключается в том, что foo () и bar () могут вызываться много раз во время работы, и распределение ресурсов кучи повсеместно может быть довольно плохим с точки зрения производительности и фрагментации памяти. Очевидным решением было бы выделить общий буфер общей памяти правильного размера один раз, а затем передать его в foo () и bar () в качестве аргумента в стиле BYOB:

void foo(void* scratchMem);
void bar(void* scratchMem);

int main() {
  const int iAmBigEnough = 5000;
  int* scratchMem = new int[iAmBigEnough];

  foo(scratchMem);
  bar(scratchMem);

  delete[] scratchMem;
  return 0;
}

void foo(void* scratchMem) {
  int* smem = (int*)scratchMem;
  // Dereferencing smem will break strict-aliasing rules!
  // ...
}

void bar(void* scratchMem) {
  float* smem = (float*)scratchMem;
  // Dereferencing smem will break strict-aliasing rules!
  // ...
}



Я думаю, у меня есть два вопроса сейчас:

- Как я могу реализовать общий буфер общей памяти, который не нарушает правила псевдонимов?

- Несмотря на то, что приведенный выше код нарушает строгие правила наложения имен,вред' делается с псевдонимом. Поэтому любой здравомыслящий компилятор может сгенерировать (оптимизированный) код, который все еще доставляет мне неприятности?

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос