我在不违反 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!
// ...
}
我想我现在有两个问题:
- 如何实现不违反别名规则的共享公共暂存内存缓冲区?
- 尽管上面的代码确实违反了严格的别名规则,但别名并没有“伤害”。因此,任何理智的编译器都可以生成(优化的)代码,但仍然会给我带来麻烦吗?
谢谢