C++ 11:新的返回连续内存吗?

lpp*_*ier 4 c++ c++11

float* tempBuf = new float[maxVoices]();
Run Code Online (Sandbox Code Playgroud)

将以上结果

1)16字节对齐的内存?

2)确认连续的内存?

我想要的是以下内容:

float tempBuf[maxVoices] __attribute__ ((aligned));
Run Code Online (Sandbox Code Playgroud)

但作为堆内存,这将对Apple Accelerate框架有效.

谢谢.

MSa*_*ers 10

内存将与floatCPU特定的SIMD指令对齐,但不一定对齐.sizeof(float) < 16不过,我强烈怀疑你的系统,这意味着它并不像你想要的那样对齐.记忆将是连续的:&A[i] == &A[0] + i.

如果你需要更具体的东西,new std::aligned_storage<Length, Alignment>会返回一个合适的记忆区域,当然假设你确实通过了更具体的对齐方式.

另一种选择是struct FourFloats alignas(16) {float[4] floats;};- 这可能更自然地映射到框架.你现在需要做new FourFloats[(maxVoices+3)/4].

  • 具体来说(§[expr.new]):"实现定义是否支持过度对齐类型(3.11).",其中"过度对齐"定义为(§[basic.align]):" ...大于alignof的对齐方式(std :: max_align_t)." (2认同)

Yak*_*ont 6

是的,new返回连续的内存.

至于对准,没有提供这种对准保证.试试这个:

template<class T, size_t A>
T* over_aligned(size_t N){
  static_assert(A <= alignof(std::max_align_t),
    "Over-alignment is implementation-defined."
  );
  static_assert( std::is_trivially_destructible<T>{},
    "Function does not store number of elements to destroy"
  );
  using Helper=std::aligned_storage_t<sizeof(T), A>;
  auto* ptr = new Helper[(N+sizeof(Helper)-1)/sizeof(Helper)];
  return new(ptr) T[N];
}
Run Code Online (Sandbox Code Playgroud)

使用:

float* f = over_aligned<float,16>(37);
Run Code Online (Sandbox Code Playgroud)

制作一个包含37个浮点数的数组,缓冲区对齐到16个字节.或者它无法编译.

如果断言失败,它仍然可以工作.测试并查阅编译器文档.一旦确信,将编译器特定的版本保护放在静态断言周围,所以当你更改编译器时,你可以重新测试(yay).

如果你想要真正的可移植性,你必须std::align与数据指针分开回退并管理资源,计算Tif和only 数量是否T有非平凡的析构函数,然后存储T缓冲区开头的"之前"的数量.它变得非常愚蠢.