Буферы разделяемой памяти в 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!
// ...
}
Я думаю, у меня есть два вопроса сейчас:
- Как я могу реализовать общий буфер общей памяти, который не нарушает правила псевдонимов?
- Несмотря на то, что приведенный выше код нарушает строгие правила псевдонимов, «псевдоним» не наносит «вреда». Поэтому любой здравомыслящий компилятор может сгенерировать (оптимизированный) код, который все еще доставляет мне неприятности?
Спасибо