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].
是的,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缓冲区开头的"之前"的数量.它变得非常愚蠢.