相关疑难解决方法(0)

C++中的共享内存缓冲区,不违反严格的别名规则

我正在努力实现共享内存缓冲区而不破坏C99的严格别名规则.

假设我有一些处理一些数据的代码,需要有一些'临时'内存来运行.我可以把它写成:

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

然后我有另一个功能,做一些其他需要一个临时缓冲区的东西:

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

问题是在操作期间可能会多次调用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;
  // …
Run Code Online (Sandbox Code Playgroud)

c++ memory buffer strict-aliasing type-punning

7
推荐指数
1
解决办法
1700
查看次数

标签 统计

buffer ×1

c++ ×1

memory ×1

strict-aliasing ×1

type-punning ×1