Буферы разделяемой памяти в 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)

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